为什么Ruby模块包含会排除模块的单例类?

hor*_*guy 9 ruby inheritance singleton module mixins

当在Ruby中继承类时,单例类也会被继承:

class A
  def self.hello
    puts "hello"
  end
end

class B < A
end

B.hello #=> "hello"
Run Code Online (Sandbox Code Playgroud)

但是对于模块,情况并非如此:

module M
  def self.goodbye
    puts "goodbye"
  end
end

class A
  include M
end

A.goodbye #=> NameError
Run Code Online (Sandbox Code Playgroud)

为了解决这个限制,许多人都会诉诸这个丑陋的黑客:

module M
  def self.included(c)
    c.extend ClassMethods
  end

  module ClassMethods
    def goodbye
      puts "goodbye"
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

好的,我的问题是:这个模块限制背后有理论/概念上的原因吗?还是只是一个实施难度?

在查看C源代码(YARV/MRI)之后,我可以确定存在实施难度(不是不可克服的,但是一个完全相同),但这是唯一的原因吗?这种限制还有其他原因吗?

谢谢

And*_*imm 0

警告:以下只是猜测。

如果您使用类,则需要单例类方法,因为您依赖它们来创建对象(例如MyClass.new)。如果您使用模块,则不需要它们,因为您不能纯粹从模块创建对象。