总有一个隐含的接收者
在 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
。