4

私はここでこのチュートリアルに取り組んでいます: http://rubymonk.com/learning/books/4-ruby-primer-ascent/chapters/39-ruby-s-object-model/lessons/131-singleton-methods-and -メタクラス

レッスンはクラス/メタクラスに関するものですが、それらは私がよく知らない構文を使用しています。以下の << の使用を参照してください。

class Object
  def metaclass
    class << self
      self
    end
  end
end


a=Object.new
p a.metaclass.new

メソッドであることは知ってdef metaclassいますが、 とはどういう意味class << selfですか? 対応するendブロックがありますが、これが正確に何をしているのかはまだよくわかりません

(注:上記の演習の要点は、メタクラスをインスタンス化できないことを示しているだけです-私は理解していますが、このコンテキストでその << 演算子に頭を悩ませているだけです.

ありがとう!

4

1 に答える 1

2

class << selfのシングルトン クラスを開き、現在のオブジェクトselfのメソッドを再定義できるようにします。self

特定の例を見てみましょう。

 s = String.new("abc")
 s.metaclass
   => "#<Class:#<String:0x0000010117e5d8>>" 

ここで何が起こるかを詳しく見てみましょう。

  • の定義内ではmetaclassself現在のインスタンス (この例では文字列 "abc") を参照します。
  • class << selfclass << "abc"この例では、指定されたインスタンスのシングルトン クラス (この場合は文字列 "abc") を開くのと同等です。
  • self次に、現在のインスタンスの開かれたクラス内に戻ります。この例では、開かれたクラスは classStringです。

一般に、 の定義はmetaclass、指定されたインスタンス/オブジェクトのクラスのクラス定義を開き、そのクラス名を返します。

「自己」の詳細については、Yehuda Katz の記事「Ruby でのメタプログラミング: 自己についてのすべて」を参照してください。

The Ruby Object Model と Metaprogramming に関する Pragmatic Programmersによるスクリーン キャスト シリーズもお勧めします。

于 2013-04-29T23:28:07.030 に答える