【问题标题】:Why module included outside the class adds instance methods to class's objects为什么包含在类之外的模块会向类的对象添加实例方法
【发布时间】:2016-09-08 13:29:34
【问题描述】:

我正在试验 Ruby include 关键字,如下所示:

module A
    def show
    puts "working"
    end
end

include A

class E
end

class D
end

e = E.new
d = D.new
e.show
d.show

o = Object.new
puts o.respond_to?("show")

******************************output****************

working
working
true

我期待输出是undefined method,但它给了我正确的输出。我还观察到module A 中定义的show 方法正在成为Object 的实例方法。

为什么这些方法会成为Object 类的实例方法? 请帮助理解这个概念。

【问题讨论】:

标签: ruby


【解决方案1】:

因为Class 类的实例继承自Object

因此,包含在Object 中的模块可用于Class 的实例(您的ED 类的实例)。

class A
end

module B
  def test; :hi end
end
#=> test

include B
#=> Object

A.new.test
#=> :hi

Object.new.test
#=> :hi

include B 写在顶层意味着include'ing BObject

include B是最外层的上下文相当于:

class Object
  include B
end

唯一不共享模块B方法的类是BasicObject

【讨论】:

  • 由于这种行为,你可以在任何东西上调用show,甚至是一个号码5.show
  • 但我没有在“对象”类中包含模块“A”??
  • @sanjay 包括在最外层范围内意味着 include'ing 进入 Object :)
  • @sanjay 绝对
  • 不,在顶级定义的方法在 Ruby 中是私有的。但是,它们在 IRb 中是公开的。这是 IRb 与 Ruby 不同的地方之一。其他一些区别是局部变量处理中的极端情况,以及一些在 Ruby 中合法但被 IRb 拒绝的语法。故事的寓意:不要使用 IRb 来验证 Ruby 行为。
猜你喜欢
  • 1970-01-01
  • 2013-08-19
  • 1970-01-01
  • 2011-04-20
  • 1970-01-01
  • 2014-12-03
  • 2012-02-10
  • 2019-08-24
  • 2010-12-25
相关资源
最近更新 更多