Rubyのclass << selfイディオム 質問する

Rubyのclass << selfイディオム 質問する

Rubyclass << selfでは は何をしますか?

ベストアンサー1

まず、class << foo構文は のシングルトン クラス (eigenclass) を開きますfoo。これにより、特定のオブジェクトで呼び出されるメソッドの動作を特殊化できます。

a = 'foo'
class << a
  def inspect
    '"bar"'
  end
end
a.inspect   # => "bar"

a = 'foo'   # new object, new singleton class
a.inspect   # => "foo"

さて、質問に答えましょう:は のシングルトン クラスclass << selfを開き、現在のオブジェクト (クラスまたはモジュール本体内ではクラスまたはモジュール自体) のメソッドを再定義できるようにします。通常、これはクラス/モジュール (「静的」) メソッドを定義するために使用されます。selfself

class String
  class << self
    def value_of obj
      obj.to_s
    end
  end
end

String.value_of 42   # => "42"

これは、次のように省略して書くこともできます。

class String
  def self.value_of obj
    obj.to_s
  end
end

あるいはもっと短く:

def String.value_of obj
  obj.to_s
end

関数定義内では、self関数が呼び出されるオブジェクトを参照します。この場合、class << selfそのオブジェクトのシングルトン クラスを開きます。その使用法の 1 つは、貧乏人の状態マシンを実装することです。

class StateMachineExample
  def process obj
    process_hook obj
  end

private
  def process_state_1 obj
    # ...
    class << self
      alias process_hook process_state_2
    end
  end

  def process_state_2 obj
    # ...
    class << self
      alias process_hook process_state_1
    end
  end

  # Set up initial state
  alias process_hook process_state_1
end

したがって、上記の例では、 の各インスタンスは にエイリアスされてStateMachineExampleいますが、後者では を に再定義できることに注意してください(のみに、他のインスタンスには影響しません)。したがって、呼び出し元がメソッド (再定義可能な を呼び出す)を呼び出すたびに、その状態に応じて動作が変わります。process_hookprocess_state_1process_hookselfStateMachineExampleprocess_state_2processprocess_hook

おすすめ記事