2种创作的主要技巧类方法(没有明显的" def self.method")是:
我个人更喜欢第二种方式,看起来更干净。有没有人有理由偏爱另一种技术?
还有" class_method"方法,但我从来没有使用它,它有相当复杂的实现,似乎比以前的2做了很多。
答案 0 :(得分:3)
self.method
是最简单的选项。
class << self
允许您在元类上定义方法。当您定义需要使用元类的其他部分的方法时(例如,别名现有方法名称),这非常有用。
例如:
class Logger
class << self
attr_reader :payload
def log(message)
@payload = message
end
end
end
模块扩展方法对于方法重用和对多个相干方法进行分组非常方便。
例如:
module QueryMethods
def find
end
def where
end
end
module FactoryMethods
def build
end
def create
end
end
class BusinessModel
extend QueryMethods
extend FactoryMethods
end
答案 1 :(得分:1)
首先,class << foo
语法打开了foo的单例类(eigenclass)。这允许您专门化在该特定对象上调用的方法的行为。
a = 'foo'
class << a
def inspect
'"bar"'
end
end
a.inspect # => "bar"
a = 'foo' # new object, new singleton class
a.inspect # => "foo"
class << self
打开self的单例类,因此可以为当前的self对象重新定义方法(在类或模块体内是类或模块本身)。通常,这用于定义类/模块(“静态”)方法
class << self
擅长将所有类方法保存在同一个块中。如果从def self.method
开始添加方法,那么就不能保证(除了约定和一厢情愿的想法)之后不会在文件后面隐藏一个额外的类方法。
def self.method
擅长明确说明方法是类方法,而使用class << self
则必须自己去找容器。
其中哪一个对您来说更重要是一个主观决定,也取决于其他人在处理代码的程度以及他们的偏好。