有人可以帮我理解以下内容吗?我在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
为什么Dog实例中存在方法bark
,即使它是在类之外声明的?因为它在同一个文件中?谢谢!
答案 0 :(得分:3)
当您在“全局”范围内创建方法(在任何类之外)时,该方法将成为Object的私有方法:
#!/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 = Dog.new
p dog.class.name # => "Dog"
p dog.class.superclass.name # => "Object"
因此,狗(实际上所有物体)现在都知道如何吠叫。但是,该方法是私有的,您必须使用instance_eval通过显式接收器调用它:
dog.instance_eval { bark } # => "Woof!"
或者您可以使用隐式接收器来呼叫它,而不需要体操:
bar # => "Woof!"
答案 1 :(得分:1)
您的确切示例在Ruby 1.9中不起作用。 (除了错误的评论语法。)
但是,在顶级范围内声明方法会使其成为Object
上的私有方法,显然:
>> Object.private_methods.include? :bark
=> true
也许在你的Ruby(1.8?)中,这是一个公共方法?