1. ホーム
  2. ruby

[解決済み] Rubyのclass << selfイディオム

2022-03-22 09:52:01

質問

とは何ですか? class << self で行います。 ルビー ?

どのように解決するのですか?

まず 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 オブジェクト(クラスやモジュールのボディの中では、クラスやモジュールの それ自体 ). 通常、クラスやモジュールの ("static") メソッドを定義するために使用されます。

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 はそのオブジェクトのシングルトンクラスを開きます。このクラスは、貧乏人のステートマシンを実装するために使われることがあります。

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

つまり、上記の例では、各インスタンスの StateMachineExampleprocess_hook にエイリアスされています。 process_state_1 を再定義することができることに注意してください。 process_hook (この場合 self のみで、他の StateMachineExample インスタンス)から process_state_2 . そのため、呼び出し元が process メソッド (これは再定義可能な process_hook )、どのような状態であるかによって動作が変わります。