4

我有一个有方法的类:

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"

作业是在班级级别不可更改的吗?如果无法做到这一点,那并不是什么大不了的事,但我希望我错过了一些基本的东西。

4

5 回答 5

4

=不是 Ruby 中可以被覆盖的运算符。Ruby(和我们一起)玩的把戏是,

self.value = "Me"
self.value= "You"
self.value=("He")

都是一样的解释,让你可以自由使用你最喜欢的版本。因为这些都是方法调用,所以您可以定义或覆盖value=一个参数的工作方式。

将其用于分配对象的属性是一种习惯用法,但是 Ruby 允许您在需要的地方使用它。

所以没有机会覆盖=运营商(我认为这是一个好主意)。

于 2013-03-13T06:16:06.113 回答
4

对不起,你不能这样做。当您编写 时foo = bar,您只是分配一个变量,而不是调用任何方法。只是something.foo = bar对方法调用进行了脱糖,就像其他任何地方一样,该方法调用的接收者是点之前的东西。

于 2013-03-13T06:16:24.297 回答
1

=根据上下文以两种方式之一解释。

  • 表单方法的一部分foo=
  • 变量赋值运算符

您可以在表单中定义自己的方法foo=,在这种情况下=,前面有一个字母,但您不能重新定义变量赋值运算符=

于 2013-03-13T06:16:35.847 回答
1

如果您尝试为类级值提供 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

于 2013-03-13T06:17:48.623 回答
1

没有办法做你所说的。您无法更改 的值self,因此没有 的类级别覆盖=

不过,我不完全确定您为什么要这样做。它可能有用的场景将需要创建该类的新实例。您可以通过克隆对象(通过.dup或其他方式)并修改新对象来完成类似的事情,或者创建自定义类方法来复制对象并返回一个新的,可能是修改后的实例。我在猜测,但想不出一个好的例子。

于 2013-03-13T06:18:41.837 回答