“class<<self” vs “extend ClassMethods”

Kap*_*lya 4 ruby

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

  1. 在“class << self”块中定义它们
  2. 定义 ClassMethod 模块并稍后扩展

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

还有“class_method”方法,但我从未使用过它,它的实现非常复杂,而且似乎比前 2 个方法做得更多。

fyl*_*ooi 5

self.method 当您只需要创建一个没有依赖项或相关逻辑的方法时,这是最简单的选择。

class << self允许您做的不仅仅是在元类上定义方法。当您定义需要与元类的其他部分一起工作的方法时,这很有用(例如,别名现有方法名称)。

例如:

class Logger
  class << self
    attr_reader :payload

    def log(message)
      @payload = message
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

模块扩展方法可用于方法重用和组合多个相关方法。

例如:

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
Run Code Online (Sandbox Code Playgroud)