&#34; class&lt; <self“vs =”“”extend =“”classmethods“=”“

时间:2017-04-09 08:59:19

标签: ruby

=”“

2种创作的主要技巧类方法(没有明显的&#34; def self.method&#34;)是:

  1. 在&#34;类&lt;&lt;中定义它们自&#34;块
  2. 定义ClassMethod模块并稍后进行扩展
  3. 我个人更喜欢第二种方式,看起来更干净。有没有人有理由偏爱另一种技术?

    还有&#34; class_method&#34;方法,但我从来没有使用它,它有相当复杂的实现,似乎比以前的2做了很多。

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则必须自己去找容器。

其中哪一个对您来说更重要是一个主观决定,也取决于其他人在处理代码的程度以及他们的偏好。

Pros of “class << self” style