クラスはオブジェクトです

Rubyを勉強する人は、Rubyのすべてのエンティティがオブジェクトであることを知っていますが、その量がわからないこともあります。 そのため、Rubyのクラスもオブジェクトです。





Rubyでは、クラスはClassクラスのインスタンスであるオブジェクトです。

OOPリマインダー


クラスは、オブジェクトの構造を記述するタイプです。
オブジェクトは、クラスのインスタンスが作成されたときに表示されるコンピューターのアドレス空間内のエンティティです。

将来、読みやすくするために、 オブジェクトのインスタンスという用語を時々使用します
クラスの用語タイプ

クラスプロパティはどこかに保存する必要があります。


記述された各クラスにはさまざまなプロパティと実行可能コードがあるため、どこかに保存する必要があります。 Rubyはデータをどこに保存しますか? 右、オブジェクト内。 また、特定のクラスを記述するオブジェクトには独自のタイプが必要であるというのは論理的です。 実際、クラスを記述するオブジェクトのタイプ(クラス)はClassです。

匿名クラス

Rubyでクラスを作成するためのメカニズムは、このような不人気な方法で理解できます。

myklass = Class.new do def test puts "TEST" end def self.ctest puts "CLASS TEST" end end myklass # => #<Class:0xb6f3e768> myklass.class # => Class myklass.name # => "" myklass.ctest # => "CLASS TEST" 


絶対に通常の匿名クラス(nameメソッドが空の文字列を返す)を作成しました。
myklass変数に入れます。 myklassとはですか? これは、クラスの説明が保存されるオブジェクトです。このオブジェクトのクラスClassです。

匿名クラス、そのすべてのメソッドと変数はmyklassオブジェクトにのみ存在します。

匿名クラスのインスタンス

匿名クラスのインスタンス(つまり、そのオブジェクト)は、他のクラスと同様に作成されます。

 m = myklass.new m.test # => 'TEST' m.class # => #<Class:0xb6f3e768> m.class==myklass # => true 


匿名クラスを継承する

匿名クラスは、匿名クラスとまったく同じ方法で継承できます。

 class MyKlass2 < myklass # ... end MyKlass2.superclass == myklass # => true #   : mk2 = Class.new myklass do # .. end mk2.superclass == myklass mk2.name # => "" 


名前で呼んで

Rubyにはちょっとした魔法があります。 クラスを記述するオブジェクトが定数に割り当てられると、クラス名が表示されます。

ご存知のように、Rubyでは、定数は大文字で始まるため、クラス名です。

 MyKlass = myklass MyKlass # => 'MyKlass' MyKlass.name # => 'MyKlass' myklass.name # => 'MyKlass' 


MyKlassはクラス名ではなく、クラスを説明するオブジェクトを格納する定数であることに注意してください。 しかし、この定数に割り当てた時点で、クラスは定数の名前と一致する名前を取得しました。

一般に、クラスの名前は、本質的に単なる参考になります。 結局、クラスは名前ではなく、保存されているのと同じ変数または定数を使用して使用します。

鶏肉か卵?


Classタイプは、他のすべてのクラスと同様に、 Objectタイプから継承されます。 しかし、この後:

 Object.class # => Class Class.class # => Class Class.superclass # => Module Module.class # => Class Module.superclass # => Object 


最初に何が起こるかを理解する- オブジェクトまたはクラスは不可能です。 クラスは、インスタンスであるクラスのオブジェクトを格納する定数になることができますか? 実際、 ObjectClass、およびModuleは、インタープリターに埋め込まれた主要な構造であり、Rubyコードによって互いに形成されることはありませんが、Rubyはそのように見せかけています。

興味深い事実。

実際、Rubyにはクラスメソッドはありません(これはdef self.aaaで記述していると思います)。 タイプのオブジェクトを含むオブジェクトのメソッドのみがあります。

しかし、その次の木曜日にもっと...

関連リンク


rhg.rubyforge.org/chapter02.html
rbdev.ru/2010/07/izuchaem-yadro-ruby-klassy-i-obekty
stackoverflow.com/questions/1219691/why-object-class-class-class-in-ruby

Source: https://habr.com/ru/post/J111738/


All Articles