John Nunemaker最近在Ruby上发表了关于various ways to define class methods的博客,给出了以下三种选择:
# Way 1
class Foo
def self.bar
puts 'class method'
end
end
# Way 2
class Foo
class << self
def bar
puts 'class method'
end
end
end
# Way 3
class Foo; end
def Foo.bar
puts 'class method'
end
答案 0 :(得分:12)
我一直使用方式1:
class Foo
def self.bar
puts 'class method'
end
end
它并不详细,它使方法保持在类的相同上下文中。
答案 1 :(得分:3)
对于单个方法,我通常更喜欢def self.foo
,而对于很长的类方法,我通常更喜欢class << self
。我觉得它区分了类方法部分和类定义的实例方法部分。
答案 2 :(得分:1)
我更喜欢Way 1,因为它不是上下文敏感的。我不喜欢跳到文件的中间然后向上或向下滚动以查看缩进是否意味着我在class << self
块中或者它只是一个嵌套模块。
答案 3 :(得分:1)
同意大多数用户。我倾向于主要使用
# Way 1
class Foo
def self.bar
puts 'class method'
end
end
如果我没记错的话,会出现一些细微的差异,这些差异会出现在Pragmatic Programmers Metaprogramming会谈中(我推荐),它与如何调用和执行类代码有关。
它们非常小,但大多数情况下我们不需要正常处理。将看看我是否可以检查并发布它。
答案 4 :(得分:0)
我查看&lt;&lt;添加方法太不寻常(虽然我很乐意使用&lt;&lt;与字符串和IO)。
我避免使用Foo.bar,因为这意味着重复自己。
答案 5 :(得分:0)
我使用Way#3,但我认为Way#1也很棒。这取决于您的使用情况。如果您希望将代码“切割/匹配”到其他模块和类中,那么Way#1会更好。我使用Way#3实际上更难以剪切/粘贴代码,b / c Ruby的口头禅是“不要重复自己”所以你不应该经常剪切/粘贴代码..