簡體   English   中英

在Ruby中,如果我們定義一個方法調用“c =”,為什么它不能被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上定義時才應將其解釋為局部變量賦值,但是存在各種問題:

  1. 至少MRI需要在​​分析時知道在給定范圍內定義了哪些局部變量。 但是,在解析時不知道是否定義了給定方法。 所以ruby無法知道c = 3是否定義變量c或者調用方法c=直到運行時,這意味着它不知道是否在解析時定義了局部變量c 這意味着MRI需要改變它在解析器中處理局部變量的方式,以使其像你想要的那樣工作。

  2. 如果方法是c=已經定義,則無法定義名為c的局部變量。 你可能會說這沒關系,因為無論如何都要使用同名的局部變量和方法。 但是請考慮這種情況,您可以在其中定義method_missing以便為每個可能的foo定義foo= (例如,在OpenStruct上就是這種情況)。 在這種情況下,根本無法定義局部變量。

  3. 您無法確定對象是否響應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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM