总有一个隐含的接收者

在 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