ruby mixin 中奇怪的继承

发布于 2024-09-10 22:17:57 字数 363 浏览 4 评论 0原文

我想知道,为什么包含的模块的方法会混合到任何后续的类定义中(就好像该类将其包含在自身中一样)?

module Foo
  def bar
    print "#{self}\n"
  end
end

class Bar
end

begin
  Bar.bar
rescue NoMethodError
  puts "There is no Bar.bar\n"
end

include Foo

bar
Bar.bar
Bar.new.bar

prints:

There is no Bar.bar
main
Bar
#<Bar:0xb73f2048>

这是预期的行为吗?为什么?

I am wondering, why is an included module's methods mixed in to any subsequent class definitions (as if the class included it in itself)?

module Foo
  def bar
    print "#{self}\n"
  end
end

class Bar
end

begin
  Bar.bar
rescue NoMethodError
  puts "There is no Bar.bar\n"
end

include Foo

bar
Bar.bar
Bar.new.bar

prints:

There is no Bar.bar
main
Bar
#<Bar:0xb73f2048>

Is this the expected behavior? Why?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

冬天旳寂寞 2024-09-17 22:17:57

当您在程序中包含 Foo 但在任何类或方法之外时,它将包含在当前作用域中,即 main 对象。

您可以通过将 bar 方法修改为以下内容来测试这一点

  def bar
    print "InBar class: #{self.class} value: #{self}\n"
  end

,然后在末尾添加以下 2 行

2.bar
Fixnum.bar

这将为您提供以下输出

There is no Bar.bar
InBar class: Object value: main
InBar class: Class value: Bar
InBar class: Bar value: #<Bar:0x21ecec>
InBar class: Fixnum value: 2
InBar class: Class value: Fixnum

When you include Foo in your program but outside of any class or method then it is included in to the current scope which is the main object.

You could test this by modifying your bar method to the following

  def bar
    print "InBar class: #{self.class} value: #{self}\n"
  end

And then adding the following 2 lines at the end

2.bar
Fixnum.bar

This would give you the following output

There is no Bar.bar
InBar class: Object value: main
InBar class: Class value: Bar
InBar class: Bar value: #<Bar:0x21ecec>
InBar class: Fixnum value: 2
InBar class: Class value: Fixnum
紫﹏色ふ单纯 2024-09-17 22:17:57

顶层的 include 将模块混合到 Object 中。只要它混合到 Object 中,它就可以作为所有内容的实例方法。

an include at top-level mixes the module into Object. In so far as it's mixed into Object it's available as an instance method on everything.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文