9

当类在 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) 后,我可以确定存在一个实现困难(不是无法克服,但都是一样的),但这是唯一的原因吗?这种限制还有其他原因吗?

谢谢

4

2 回答 2

1

除非任何人都能提出令人信服的论点,否则我认为限制仅在于实施难度。尽管如此,过去几天我一直在解决这个问题,并且(在测试版中)有一个新版本的 include 调用include_complete来解决这些困难,并允许模块继承像类继承一样工作(引入单例)

在这里查看项目:http: //github.com/banister/include_complete

请注意,该项目仍处于测试阶段,但到目前为止似乎仍能按预期工作

于 2010-10-04T03:53:22.933 回答
0

警告:以下只是推测。

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

于 2010-10-03T10:09:34.227 回答