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

时间:2010-10-03 04:08:07

标签: ruby inheritance module singleton mixins

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

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

class B < A
end

B.hello #=> "hello"

然而,对于模块,情况并非如此:

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

class A
  include M
end

A.goodbye #=> NameError

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

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

  module ClassMethods
    def goodbye
      puts "goodbye"
    end
  end
end

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

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

感谢

2 个答案:

答案 0 :(得分:1)

除非有人能提出令人信服的论据,否则我认为限制只取决于实施难度。尽管如此,我在过去几天一直在研究这个问题,并且(测试中)有一个名为include_complete的新版本的套件,可以克服这些困难并允许模块继承像类继承一样工作(引入单例)

在此处查看项目:http://github.com/banister/include_complete

请注意,该项目仍然处于测试阶段,但到目前为止似乎仍然可以正常工作

答案 1 :(得分:0)

警告:以下只是推测。

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