为什么要使用class<<红宝石中的自我?

时间:2010-10-29 17:13:35

标签: ruby

您能解释为什么开发人员使用class << self向基类添加方法吗?

base.rb from the GeoPlanet Gem

module GeoPlanet
  class Base
    class << self
      def build_url(resource_path, options = {})
    end
  end
end

2 个答案:

答案 0 :(得分:9)

因为他不知道

def GeoPlanet::Base.build_url(resource_path, options = {}) end

也能正常工作吗?

好吧,它们不是100%等价的:如果GeoPlanet不存在,那么原始代码段会创建模块,但我的版本会引发NameError。要解决这个问题,你需要这样做:

module GeoPlanet
  def Base.build_url(resource_path, options = {}) end
end

如果NameError不存在,那么当然会引发Base。要解决那个,您需要:

module GeoPlanet
  class Base
    def self.build_url(resource_path, options = {}) end
  end
end

但是你看一下,没有需要来使用单例类语法。有些人只是喜欢它。

答案 1 :(得分:6)

我认为这只是风格/品味的问题。我喜欢使用class << self方法,因为我想要将很多类方法组合在一起,或者提供某种与实例方法的视觉分离。

如果我的所有方法都是GeoPlanet作者所做的类方法,我也会使用这种方法。