質問

class << self
attr_accessor :n, :totalX, :totalY
end

前述の構文を使用のためのクラスを定義するインスタンス変数.ものについて考えるときに何構文の意味するものではありませんの作りによるものなのかということであっったればこの種類の書式を使用その他の種類の定義。私の混乱がここにあなたの

class << self

の追加オペレーターは通常追加"何の右側のオブジェクトの左側"でもこのブロックされるのは、どのような追加するために"の内容を、このブロックの定義クラスのインスタンスではなく、インスタンス?

同じ理由でとても面白かった理由としては、一つのコンテキストクラス << 自己を定義することができクラスのインスタンス変数を別のようですの作成クラス変数などはこちら

class Point
  # Instance methods go here
  class << self
    # Class methods go here
  end
end
役に立ちましたか?

解決

Rubyを開き直せるようにし既存のクラスに追加す。それは、と言ってもいいでしょう:

class Foo
  def bob
    return "hello from bob"
  end
end

これらの方法で取得し保管のどこかに内部の辞書にもインスタンス変数の Foo-授業でのインスタンス Classクラスのため インスタンス変数)

そのsuprisingものであることもできますの追加方法 インスタンス の既存オブジェクト

foo = Foo.new
foo2 = Foo.new

def foo.fred
  return "I am fred"
end


foo.fred  #=> "I am fred"
foo2.fred #=> NoMethodError

ここはどこのメソッドは、実際には存?

がRubyの新しいクラスの裏られたものである singletonクラス, 形式のメタクラス または eigenclass るが挿入され、継承階層 との間Foo-クラスとそのインスタンス.

その相続関係のようになる:

foo < (eigenclass of foo) < Foo < Class

(と言えばfoo.スーパークラスませんので、singletonクラス)

class << X-構文をわかりやすく伝えるためにこのクラスで操作できます。次のコードブロックを正確に等価です:

def foo.bar
  return "xy"
end

# is exactly the same as

class << foo
  def bar
    return "xy"
  end
end

その間の類似度 class Foo < Barclass << Foo な偶然が相続く。

思い class << X "としての形式のメタクラスのX"

ものを覚えていRubyではの授業を自分だけます。(インスタンスのクラス Class いばらしいです:

class Foo
  class << self
    def k
      return "x"
    end
  end
end

(selfFoo このコードブロック) kインスタンスメソッド のeigenclassの Foo, 間で同期することにより、クラス方法 Foo

これは説明をより明確にし、 第つの授業の嘴 (ウェブバージョンに含まれていない図表、残念ながら)_whys 見Metaclasses明

他のヒント

すべてのアクセサおよびインスタンス変数を含むメンバーの辞書を含むように、クラスを考えます。あなたは、「自分自身」に「追加」するクラスを教えてくれたとき、あなたは「クラスメンバーの辞書にこれらを追加します。」と言っている。

私は、表記を与えるだろうけれども、少しhinkyです。

これは、「追加」オペレータの観点から考えて、実際に紛らわしいです。それを見て良い方法はclass FooはFooクラスを開くと同じように、つまり、それが必要な場合は、作成クラスオブジェクトfooへの「自己」を、設定していることなので、class << selfは、現在の「自己」オブジェクトのeigenclassを開きます。それは、自己に限定されるものではないことに注意してください - 。あなたがクラス<<バーは、そのオブジェクトのeigenclassを開くために言うことができる、任意のオブジェクトバーのための

class A
  def hello
    print "hello world"
  end
end

a = A.new
b = A.new

class << a
  def goodbye
    print "goodbye cruel world"
  end
end

a.hello
b.hello
a.goodbye
b.goodbye
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top