重複の可能性:
クラス<<Rubyの自己イディオム
Rubyについて簡単に質問します。私はJava/cのバックグラウンドを持っているので、Rubyでは、インスタンスメソッド内で参照される「self」が「this」のように機能することを理解しています。そして「自己」。メソッドのプレフィックスは、クラスメソッドとして定義します。
しかし、これはここでどういう意味ですか?
class << self
def some_method
end
end
重複の可能性:
クラス<<Rubyの自己イディオム
Rubyについて簡単に質問します。私はJava/cのバックグラウンドを持っているので、Rubyでは、インスタンスメソッド内で参照される「self」が「this」のように機能することを理解しています。そして「自己」。メソッドのプレフィックスは、クラスメソッドとして定義します。
しかし、これはここでどういう意味ですか?
class << self
def some_method
end
end
ここで起こっていることは、オブジェクトのクラスをそれ自体の内部から再度開き、その上に新しいインスタンスメソッドを定義しているということです。これは、Rubyでいわゆる「モンキーパッチ」を実行する方法の1つです。このメソッドは、クラスのすべてのオブジェクトではなく、現在のオブジェクトにのみメソッドを追加します。
これを行うのと同じです:
my_obj = MyClass.new
class << my_obj
def some_method
end
end
# or...
def my_obj.some_method
end
これをカバーする良い記事があります:Rubyの学習:class<<self。
構文は、そのオブジェクトのみが属する特別な「秘密」クラスであるシングルトンクラスをclass << some_objct
開きます。some_object
シングルトンクラスを使用すると、あるオブジェクトが応答するメソッドを定義できますが、通常のクラスの他のインスタンスは応答しません。
したがって、たとえば:
a = "Hello world"
b = "Hello world" # Note that this is a different String object
class << a
def first_letter
self[0,1]
end
end
puts a.first_letter # prints "H"
puts b.first_letter # Raises an error because b doesn't have that method
クラスのコンテキストでは、これら2つのメソッド定義は同等です。
class Foo
def self.bar
puts "Yo dawg"
end
end
class Foo
class << self
def bar
puts "Yo dawg"
end
end
end
attr_accessor
2番目の形式は、特定の状況(クラスオブジェクト自体に対してsを宣言する場合など)で役立ちます。
これは、オブジェクトのシングルトン/固有クラスのメソッドを定義する方法です。
class << foo
def bar
end
end
と同等です
def foo.bar
end
このように使用する場合:
class Foo
class << self
def something
puts "something"
end
def something_else
puts "something else"
end
end
end
Foo.something
これは次の略記です。
class Foo
def self.something
puts "something"
end
def self.something_else
puts "something else"
end
end
私はこの表記法のファンではありません。