您能解释为什么开发人员使用class << self
向基类添加方法吗?
base.rb from the GeoPlanet Gem
module GeoPlanet
class Base
class << self
def build_url(resource_path, options = {})
end
end
end
答案 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作者所做的类方法,我也会使用这种方法。