Ruby:编写类外扩展和类内扩展有什么区别

Ruby:编写类外扩展和类内扩展有什么区别,ruby,module,mixins,Ruby,Module,Mixins,我在url上读过这个问题。根据这个问题的答案,我希望类加法和ABc可以访问模块Calculation的方法print2。但是对于加法:类(NoMethodError),我得到的错误是未定义方法print2'` 请解释发生此错误的原因 谢谢扩展的接收者应该是每个类,因此您需要Addition.extend Calculation和Abc.extend Calculation(在类定义之后)。分号不是必需的 module D def dog puts "woof" end end

我在url上读过这个问题。根据这个问题的答案,我希望类
加法
ABc
可以访问模块
Calculation
的方法
print2
。但是对于加法:类(NoMethodError),我得到的错误是
未定义方法
print2'`

请解释发生此错误的原因


谢谢扩展的接收者应该是每个类,因此您需要
Addition.extend Calculation
Abc.extend Calculation
(在类定义之后)。分号不是必需的

module D
  def dog
    puts "woof"
  end
end

class A; end
A.extend D
A.dog #=> "woof"

class B; end
B.extend D
B.dog #=> "woof"

我的直觉是你的
扩展
(在任何类之外)扩展了main的本征类。Main是当前运行时环境的对象的实例。特征类是对象的类,其唯一实例是给定对象。Ruby中的每个对象都有一个特征类。没有任何东西是从特征类继承的。因此,您的
扩展
不会继承到任何其他类。

您是正确的。只要问问Ruby:
self#=>main/self.class#=>Object/extend-Calculation/self.print2#=>(prints)“print2”/self.singleton_方法。包括?(:print2)#=>true/Object.new.print2#未定义方法
print2”。
module D
  def dog
    puts "woof"
  end
end

class A; end
A.extend D
A.dog #=> "woof"

class B; end
B.extend D
B.dog #=> "woof"