ruby - ruby mixin 中奇怪的继承

标签 ruby module mixins

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

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

打印:

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

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

最佳答案

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

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

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

然后在最后添加以下两行

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

关于ruby - ruby mixin 中奇怪的继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3325741/

相关文章:

C - Linux - 内核模块 - TCP header

.net - DotNetNuke 文件管理

vue.js - 将 prop 传递给 vuejs mixin 但属性未定义

module - 如何在 nextflow dsl2 的同一模块中重复使用同一进程两次,但以不同的名称保存输出?

javascript - 如何从 Rails 中删除 Turbolink

ruby - 无法加载此类文件 -- ruby​​gems/core_ext/kernel_warn (LoadError)

jquery - Sprockets::FileNotFound:找不到文件 'jquery-ui'?

java - 使用 Jackson 将多个 mixins 添加到一个类中

interface - 测量单位、接口(interface)和 Mixin

mysql - Ruby Gem Mysql Mac 10.6.8