我正在尝试在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
声明这样一组函数的正确语法是什么?
答案 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