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
を開き、現在のオブジェクト (クラスまたはモジュール本体内ではクラスまたはモジュール自体) のメソッドを再定義できるようにします。通常、これはクラス/モジュール (「静的」) メソッドを定義するために使用されます。self
self
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_hook
process_state_1
process_hook
self
StateMachineExample
process_state_2
process
process_hook