4

重複の可能性:
クラス<<Rubyの自己イディオム

Rubyについて簡単に質問します。私はJava/cのバックグラウンドを持っているので、Rubyでは、インスタンスメソッド内で参照される「self」が「this」のように機能することを理解しています。そして「自己」。メソッドのプレフィックスは、クラスメソッドとして定義します。

しかし、これはここでどういう意味ですか?

class << self
  def some_method
  end
end
4

4 に答える 4

4

ここで起こっていることは、オブジェクトのクラスをそれ自体の内部から再度開き、その上に新しいインスタンスメソッドを定義しているということです。これは、Rubyでいわゆる「モンキーパッチ」を実行する方法の1つです。このメソッドは、クラスのすべてのオブジェクトではなく、現在のオブジェクトにのみメソッドを追加します。

これを行うのと同じです:

my_obj = MyClass.new

class << my_obj
  def some_method
  end
end

# or...

def my_obj.some_method
end

これをカバーする良い記事があります:Rubyの学習:class<<self

于 2010-07-27T23:10:25.550 に答える
1

構文は、そのオブジェクトのみが属する特別な「秘密」クラスであるシングルトンクラスを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_accessor2番目の形式は、特定の状況(クラスオブジェクト自体に対してsを宣言する場合など)で役立ちます。

于 2010-07-27T23:22:57.113 に答える
0

これは、オブジェクトのシングルトン/固有クラスのメソッドを定義する方法です。

class << foo
  def bar
  end
end

と同等です

def foo.bar
end
于 2010-07-27T23:11:44.110 に答える
-1

このように使用する場合:

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

私はこの表記法のファンではありません。

于 2010-07-27T23:11:25.373 に答える