7

用法上有区别吗

class Helper
  class << self
    # ...
  end
end

module Helper
  class << self
    # ...
  end
end

您什么时候会使用其中一种?

4

2 回答 2

6

class<<self似乎是一条红鲱鱼,因为这里唯一的区别是类与模块。也许您在问“我想创建一个我不打算实例化的对象,但它仅作为某些方法的命名空间存在(并且可能作为具有自己的全局状态的单例)存在。”

如果是这种情况,两者都将发挥同样的作用。如果您有可能想要创建一个派生类(另一个继承相同方法的对象),那么您应该使用一个类,因为它更容易编写:

class Variation < Helper

代替

module Helper
  module OwnMethods
    # Put methods here instead of class << self
  end
  extend OwnMethods
end

module Variation
  extend Helper::OwnMethods

但是,对于命名空间,我通常会在类上使用模块,因为类意味着将发生实例化。

于 2012-04-05T23:13:17.590 回答
2

模块和类之间的区别在于您可以创建类的实例,但不能创建模块。如果您需要创建 Helper 的实例 (h = Helper.new),那么它应该是一个类。如果没有,最好保留一个模块。我不确定您的其余代码与该问题有何关联;您是否在 Module 或 Class 上有类方法与您是否需要创建该对象的实例无关。

于 2012-04-05T23:14:49.443 回答