在Ruby中,如果我们定义了一个方法调用“c=”,为什么不能通过c = 3来调用它?

2024-02-03

例如,如果我们

def c=(foo)
  p "hello"
end

c = 3
c=(3)

并且不会打印“hello”。我知道它可以被调用self.c = 3但为什么?还可以通过哪些其他方式调用它?


c = 3 (and c = (3),与它完全等效)始终被解释为局部变量赋值。您可能会说,只有当方法c=没有在 self 上定义,但是存在各种问题:

  1. 至少 MRI 需要在解析时知道在给定范围内定义了哪些局部变量。然而,在解析时不知道是否定义了给定方法。所以 ruby​​ 不知道是否c = 3定义变量c或调用该方法c=直到运行时,这意味着它不知道局部变量是否c在解析时定义。这意味着 MRI 需要改变它在解析器中处理局部变量的方式,以使其按照您想要的方式工作。

  2. 不可能定义名为的局部变量c如果一个方法是c=已经定义了。您可能会说这没关系,因为具有相同名称的局部变量和方法无论如何都会令人困惑。但是请考虑一下您定义的情况method_missing以便foo=为每个可能的 foo 定义(如上的情况OpenStruct例如)。在这种情况下,根本不可能定义局部变量。

  3. 你无法确定一个物体是否响应c=不运行它,因为它可能由method_missing。所以整个事情实际上是无法确定的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在Ruby中,如果我们定义了一个方法调用“c=”,为什么不能通过c = 3来调用它? 的相关文章

随机推荐