2 创建类方法的主要技术(没有明显的"def self.method")是:
- 在"类<<自身"块中定义它们
- 定义类方法模块并在以后扩展它
我个人更喜欢第二种方式,看起来更干净。有没有人有任何理由更喜欢一种技术而不是另一种技术?
还有"class_method"方法,但我从未使用过它,它具有相当复杂的实现,并且似乎比前 2 个做得更多。
当您只需要创建一个没有依赖项或相关逻辑的方法时,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
首先,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
你必须自己去找容器。
其中哪一个对你更重要是一个主观的决定,也取决于有多少人在处理代码以及他们的偏好是什么。
"课堂<<自我"风格的优点