![](/img/trans.png)
[英]In Ruby, if we define “c=(foo)” and it returns foo + 1, why is this not assigned to d = (self.c = 3)?
[英]In Ruby, if we define a method call “c=”, why can't it be invoked by c = 3?
例如,如果我們
def c=(foo)
p "hello"
end
c = 3
c=(3)
並且不打印“你好”。 我知道它可以被self.c = 3
調用,但為什么呢? 以及在其他方面可以調用它?
c = 3
(和c = (3)
,它完全等價)總是被解釋為局部變量賦值。 您可能會說只有在方法c=
未在self上定義時才應將其解釋為局部變量賦值,但是存在各種問題:
至少MRI需要在分析時知道在給定范圍內定義了哪些局部變量。 但是,在解析時不知道是否定義了給定方法。 所以ruby無法知道c = 3
是否定義變量c
或者調用方法c=
直到運行時,這意味着它不知道是否在解析時定義了局部變量c
。 這意味着MRI需要改變它在解析器中處理局部變量的方式,以使其像你想要的那樣工作。
如果方法是c=
已經定義,則無法定義名為c
的局部變量。 你可能會說這沒關系,因為無論如何都要使用同名的局部變量和方法。 但是請考慮這種情況,您可以在其中定義method_missing
以便為每個可能的foo定義foo=
(例如,在OpenStruct
上就是這種情況)。 在這種情況下,根本無法定義局部變量。
您無法確定對象是否響應c=
而不運行它,因為它可能由method_missing
處理。 所以整件事實際上是不可判定的。
因為局部變量優先於先前定義的具有相同名稱的方法/變量。 在這種情況下,您需要使用'self'進行限定,以便c不被解釋為局部變量的聲明/賦值。
如果代碼不能被解釋為變量賦值,Ruby只會調用這種方法。 沒有更好的方法來強制方法調用。
self.c = 1
send(:c=, 1)
__send__(:c=, 1)
method(:c=).call(1)
method(:c=)[1]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.