在类中声明的方法是否自动包含在类中?

时间:2010-02-19 20:34:43

标签: ruby

有人可以帮我理解以下内容吗?我在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,即使它是在类之外声明的?因为它在同一个文件中?谢谢!

2 个答案:

答案 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?)中,这是一个公共方法?