有人可以帮助我理解以下内容吗?我在 test.rb 中有以下代码:
class Dog
end
// bark is declared outside of Dog class
def bark
puts 'Woof!'
end
然后在 irb 中:
>> source 'test.rb'
>> a = Dog.new
=> #<Dog:0x117f614>
>> a.bark
Woof!
=> nil
为什么方法 bark
存在于 Dog 实例中,即使它是在类之外声明的?因为它在同一个文件中?谢谢!
最佳答案
当您在“全局”范围内(任何类之外)创建方法时,该方法将成为 Object 的私有(private)方法:
#!/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
对象在所有对象的祖先链中,包括狗:
dog = Dog.new
p dog.class.name # => "Dog"
p dog.class.superclass.name # => "Object"
因此,狗(实际上所有物体)现在都知道如何吠叫。但是,该方法是私有(private)的,您必须使用 instance_eval 来使用显式接收器调用它:
dog.instance_eval { bark } # => "Woof!"
或者您可以使用隐式接收器调用它,无需体操:
bar # => "Woof!"
关于ruby - 在类之外声明的方法是否自动包含?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2299361/