我有一个有一个方法的课程:
def value=(valueIN)
some code
end
这完全符合我的要求:
(class instance).value="new data"
如果我可以覆盖此类的=
,那么似乎更干净,因此我不必执行value=
。首先,我试过了:
def =(valueIN)
some code
end
但这给了我一个错误,所以我尝试了:
def self=(valueIN)
some code
end
这不会导致错误,但是当我这样做时它不起作用:
(class instance)="new data"
作业是否在课堂上无法改变?如果不能做到这一点,那不是什么大不了的事,但我希望我遗漏一些基本的东西。
答案 0 :(得分:4)
抱歉,你不能这样做。当你写foo = bar
时,你只是分配一个变量,而不是调用任何方法。只有something.foo = bar
才能进行方法调用,就像其他地方一样,该方法调用的接收者就是点之前的东西。
答案 1 :(得分:2)
=
不是Ruby中可以覆盖的运算符。 Ruby扮演的角色(和我们一起)就是那个
self.value = "Me"
self.value= "You"
self.value=("He")
都被解释为相同,因此您可以自由使用您最喜欢的版本。因为这些都是方法调用,所以您可以定义或覆盖带有一个参数的value=
应该如何工作。
使用 only 来分配对象的属性是一种习惯用法,但Ruby允许你在任何你想要的地方使用它。
所以没有机会覆盖=
运算符(我认为这是一个好主意)。
答案 2 :(得分:1)
=
根据上下文以两种方式之一进行解释。
foo=
您可以使用foo=
形式定义自己的方法,在这种情况下,=
前面有一个字母,但您无法重新定义变量赋值运算符=
。
答案 3 :(得分:1)
没有办法做你正在谈论的事情。您无法更改self
的值,因此=
没有类级别覆盖。
.dup
或其他东西)并修改新对象来完成类似的事情,或创建自定义类方法来复制对象并返回一个新的,可能已修改的实例。我在猜测,但想不出一个好的例子。
答案 4 :(得分:0)
如果您尝试为类级别值提供setter方法,则可以使用以下内容执行此操作:
class MyClass
def self.my_class_attribute=(value)
@my_class_attribute = value
end
end
然后您可以这样分配:
MyClass.my_class_attribute = "new value"
这将调用.my_class_attribute=
上的方法MyClass
。