例如,如果我们
def c=(foo)
p "hello"
end
c = 3
c=(3)
并且不会打印“hello”。我知道它可以被调用self.c = 3
但为什么?还可以通过哪些其他方式调用它?
c = 3
(and c = (3)
,与它完全等效)始终被解释为局部变量赋值。您可能会说,只有当方法c=
没有在 self 上定义,但是存在各种问题:
至少 MRI 需要在解析时知道在给定范围内定义了哪些局部变量。然而,在解析时不知道是否定义了给定方法。所以 ruby 不知道是否c = 3
定义变量c
或调用该方法c=
直到运行时,这意味着它不知道局部变量是否c
在解析时定义。这意味着 MRI 需要改变它在解析器中处理局部变量的方式,以使其按照您想要的方式工作。
不可能定义名为的局部变量c
如果一个方法是c=
已经定义了。您可能会说这没关系,因为具有相同名称的局部变量和方法无论如何都会令人困惑。但是请考虑一下您定义的情况method_missing
以便foo=
为每个可能的 foo 定义(如上的情况OpenStruct
例如)。在这种情况下,根本不可能定义局部变量。
你无法确定一个物体是否响应c=
不运行它,因为它可能由method_missing
。所以整个事情实际上是无法确定的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)