为什么在Ruby中要使用"class << self"?

4
你能解释一下为什么开发者要使用class << self将方法添加到基类中吗?
从GeoPlanet Gem的base.rb文件可以看出。
module GeoPlanet
  class Base
    class << self
      def build_url(resource_path, options = {})
    end
  end
end
2个回答

9
因为他不知道
def GeoPlanet::Base.build_url(resource_path, options = {}) end

这两种方法都可以工作吗?

实际上,它们并不完全等价:如果GeoPlanet不存在,则原始代码段将创建该模块,但我的版本会引发NameError。为解决此问题,您需要执行以下操作:

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

如果Base不存在,这当然会引发NameError。为了解决这个问题,你可以这样做:

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

无论如何看待,使用单例类语法都是没有必要的。有些人只是喜欢它。

好的,GeoPlanet 的例子有点奇怪,对吧?你的两个例子更易读,我倾向于使用 'self.build_url' 的方式。 - jspooner

6

我认为这只是一种风格/口味问题。当我有很多类方法需要分组或提供某种视觉分离时,我喜欢使用class << self的方法。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接