有人能帮助我理解以下内容吗?我在test.rb中有以下代码:
class Dog
end
// bark is declared outside of Dog class
def bark
puts 'Woof!'
end
Run Code Online (Sandbox Code Playgroud)
然后在irb:
>> source 'test.rb'
>> a = Dog.new
=> #<Dog:0x117f614>
>> a.bark
Woof!
=> nil
Run Code Online (Sandbox Code Playgroud)
为什么barkDog实例中存在方法,即使它是在类之外声明的?因为它在同一个文件中?谢谢!
当您在“全局”范围(任何类之外)创建方法时,该方法将成为对象的私有方法:
#!/usr/bin/ruby1.8
class Dog
end
p Object.respond_to?(:bark, true) # => false
def bark
puts "Woof!"
end
p Object.respond_to?(:bark, true) # => true
Run Code Online (Sandbox Code Playgroud)
Object 位于所有对象的祖先链中,包括 Dog:
dog = Dog.new
p dog.class.name # => "Dog"
p dog.class.superclass.name # => "Object"
Run Code Online (Sandbox Code Playgroud)
因此狗(实际上是所有物体)现在知道如何吠叫。但是,该方法是私有的,您必须使用 instance_eval 来通过显式接收器调用它:
dog.instance_eval { bark } # => "Woof!"
Run Code Online (Sandbox Code Playgroud)
或者您可以使用隐式接收器来调用它,无需任何体操:
bar # => "Woof!"
Run Code Online (Sandbox Code Playgroud)