ruby - 在类之外声明的方法是否自动包含?

标签 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

为什么方法 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/

相关文章:

ruby-on-rails - ruby 强度和用途

ruby-on-rails - .seek 在 ruby​​ 中是什么意思

ruby-on-rails - 一个最初建立在 Ubuntu 上的 Rails 项目可以在 Mac 环境上运行吗?

ruby - String#[] Ruby 1.8.7 和 1.9.3 的区别

ruby - 将 XPath 与 HTML 或 XML 片段一起使用?

mysql - 如何配置 Rails 以实现对远程数据库的无密码访问

Ruby on Rails 上传文件问题 奇数 utf8 转换错误

ruby-on-rails - 验证多个字段之间值的唯一性

ruby - 将 ruby​​ 项目从 1.8.6 升级到 1.8.7

ruby-on-rails - Ruby 的文件类与 Rails 的 FileUtils