用于声明lvalue/rvalue =运算符的Ruby语法

use*_*176 0 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
Run Code Online (Sandbox Code Playgroud)

我想要的主要是建立一个更复杂的幕后功能,具体取决于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 
Run Code Online (Sandbox Code Playgroud)

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

Hol*_*ust 5

将值赋给裸字时secret_datum = what,总是要设置一个简单的局部变量.

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

def public_datum=(what)
  self.secret_datum = what
end
Run Code Online (Sandbox Code Playgroud)

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

def public_datum=(what)
  @secret_datum = what
end
Run Code Online (Sandbox Code Playgroud)

最后请注意,您的secret_datum访问者仍然是公开的.因此,你也可以打电话a.secret_datum = 7,它将完全相同.