覆盖ruby中的“=”运算符

时间:2013-03-13 06:09:27

标签: ruby

我有一个有一个方法的课程:

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"

作业是否在课堂上无法改变?如果不能做到这一点,那不是什么大不了的事,但我希望我遗漏一些基本的东西。

5 个答案:

答案 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