"class<<self" vs "extend ClassMethods"



2 创建类方法的主要技术(没有明显的"def self.method")是:

  1. 在"类<<自身"块中定义它们
  2. 定义类方法模块并在以后扩展它

我个人更喜欢第二种方式,看起来更干净。有没有人有任何理由更喜欢一种技术而不是另一种技术?

还有"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你必须自己去找容器。

其中哪一个对你更重要是一个主观的决定,也取决于有多少人在处理代码以及他们的偏好是什么。

"课堂<<自我"风格的优点

相关内容

最新更新