總有一個隱含的接收者

在 Ruby 中,所有方法呼叫總是有一個隱式接收器。該語言保留對儲存在變數 self 中的當前隱式接收器的引用。某些語言關鍵詞如 classmodule 將改變 self 指向的內容。理解這些行為對掌握語言非常有幫助。

例如,當你第一次開啟 irb

irb(main):001:0> self
=> main

在這種情況下,main 物件是隱式接收器( 有關 main 的更多資訊,請參閱 http://stackoverflow.com/a/917842/417872 )。

你可以使用 def 關鍵字在隱式接收器上定義方法。例如:

irb(main):001:0> def foo(arg)
irb(main):002:1> arg.to_s
irb(main):003:1> end
=> :foo
irb(main):004:0> foo 1
=> "1"

這已經在 repl 中執行的主物件的例項上定義了方法 foo。

請注意,在方法名稱之前查詢區域性變數,因此如果你定義具有相同名稱的區域性變數,則其引用將取代方法引用。繼續前一個例子:

irb(main):005:0> defined? foo
=> "method"
irb(main):006:0> foo = 1
=> 1
irb(main):007:0> defined? foo
=> "local-variable"
irb(main):008:0> foo
=> 1
irb(main):009:0> method :foo
=> #<Method: Object#foo>

method 方法仍然可以找到 foo 方法,因為它不檢查區域性變數,而正常參考 foo