總有一個隱含的接收者
在 Ruby 中,所有方法呼叫總是有一個隱式接收器。該語言保留對儲存在變數 self
中的當前隱式接收器的引用。某些語言關鍵詞如 class
和 module
將改變 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
。