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

pen*_*ger 5 ruby

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

Way*_*rad 3

当您在“全局”范围(任何类之外)创建方法时,该方法将成为对象的私有方法:

#!/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)