Ruby语法,用于声明一个左值/右值=运算符

时间:2018-11-01 13:33:59

标签: ruby

我正在尝试在Ruby中构建一个equals函数。我想做的是这样的,假设我们有一个叫做A的类:

class A
    attr_accessor :secret_datum

    def public_datum
        return secret_datum
    end

    def public_datum= what
      secret_datum = what
    end
end

我基本上想要的是根据public_datum是用作左值还是右值来构建更复杂的后台功能,但是上面的代码不起作用:

2.5.0 :027 > a = A.new
 => #<A:0x00007fc2293ec338> 
2.5.0 :028 > a.public_datum = 7
 => 7 
2.5.0 :029 > a.public_datum
 => nil 

声明这样一组函数的正确语法是什么?

2 个答案:

答案 0 :(得分:5)

使用secret_datum = what为裸词分配值时,您总是设置简单的局部变量。

似乎您实际上是想使用类的设置器(然后设置实例变量)。为此,您必须向Ruby提示您要调用该方法。您可以通过定义接收器对象来实现。这样,您的二传手可以看起来像这样:

def public_datum=(what)
  self.secret_datum = what
end

或者,您可以按如下所示直接设置实例变量:

def public_datum=(what)
  @secret_datum = what
end

最后,请注意,您的secret_datum访问者仍然是公开的。因此,您也可以调用a.secret_datum = 7,它的工作原理完全相同。

答案 1 :(得分:1)

实例变量声明为带有前缀“ @”,例如     @secret_datum =什么

没有@时,变量在堆栈上声明,并在退出函数时消失。

因此,只需将实例变量称为@secret_datum,它将起作用

def public_datum=(what)
  @secret_datum = what
end