首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么向模块中添加方法与添加子模块的处理方式不同?

为什么向模块中添加方法与添加子模块的处理方式不同?
EN

Stack Overflow用户
提问于 2014-03-14 12:53:58
回答 1查看 150关注 0票数 5

在下面的示例中,模块M包含在类A中,然后重新打开以添加子模块MM和方法。然后,它将包含在类B中。

代码语言:javascript
复制
module M
  def foo; "foo" end 
end

class A
  include M
end

module MM
  def baz; "baz" end 
end

module M
  include MM
  def bar; "bar" end 
end

class B
  include M
end

AB的实例都可以访问M的方法,不管它们是什么时候添加的,但是只有B有子模块MM的方法。

代码语言:javascript
复制
a = A.new
a.foo
a.bar
a.baz # => Error: not defined

b = B.new
b.foo
b.bar
b.baz

我认为这是不一致的行为,我想了解为什么会发生这种情况。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-14 15:18:32

当您将模块include M与超类S合并为类C时,会发生以下情况:

  1. 创建了一个类M',其方法表指针、常表指针、实例变量表指针和类变量表指针指向M的方法表、常数表、实例变量表和类变量表。
  2. M'的超类指针被设置为C的超类(即S)。
  3. C的超类指针被设置为M'

对于任何混入M的模块(以及混合到M中的模块等等),这个过程都是递归的。

这样,当调用include时,混和层次结构的线性化只需要发生一次。另一种选择(这似乎就是您所期望的那样)将是为每个方法调用执行这个非常昂贵的过程。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22405602

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档