Rubyであるの応用の構文:クラス << 自---終了
質問
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 < Bar
や class << Foo
な偶然が相続く。
思い class << X
"としての形式のメタクラスのX"
ものを覚えていRubyではの授業を自分だけます。(インスタンスのクラス Class
いばらしいです:
class Foo
class << self
def k
return "x"
end
end
end
(self
結 Foo
このコードブロック) 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