この作品
簡単操作を行います。そうでないと。とにかくルビーではない。
他のほとんどの言語と同様、単純に存在すると思われるいくつかのコアエンティティがあります。彼らは空から落ち、薄い空気の中に現れ、魔法のように現れる。 Rubyで
、それらの魔法の事のいくつかは、次のとおりです。
Object
は、スーパークラスを持っていませんが、あなたはありませんスーパークラスを持つクラスを定義することはできません、暗黙の直接のスーパークラスは常にObject
です。 [注:実装定義のスーパークラスObject
が存在する可能性がありますが、最終的にスーパークラスを持たないスーパークラスが存在します。]
Object
Class
(間接的
Object
が
Object
自体のインスタンスであることを意味する)
Object
のサブクラスである、
Class
のインスタンスである
Class
Class
のインスタンスである、Module
のサブクラスでありますClass
これらはいずれもRubyで説明することはできません。
BasicObject
,Object
,Module
およびClass
は、それらが循環依存性を有するため、同時に存在する必要があります。
この関係はRubyコードで表現できないという理由だけで、Ruby言語仕様ではそうでなければならないとは言えません。これを行う方法を理解するのは実装者次第です。結局のところ、Ruby実装には、プログラマが持っていないオブジェクトへのアクセスレベルがあります。
例えば、Rubyの実装では、最初にそのsuperclass
ポインタとnull
に対するclass
ポインタの両方を設定し、BasicObject
を作成することができます。
その後、それはBasicObject
へのsuperclass
ポインタとnull
へのclass
のポインタを設定し、Object
を作成します。
次に、Object
に対するsuperclass
ポインタとnull
に対するclass
ポインタを設定し、Module
を作成します。
最後に、それはModule
へのsuperclass
ポインタとnull
へのclass
のポインタを設定し、Class
を作成します。
今、私たちはClass
を指すようにBasicObject
年代、Object
年代、Module
年代、およびClass
のclass
ポインタを上書きすることができ、私たちは完了です。
これはシステム外から行うのは簡単ですが、内部から奇妙に見えます。
ただし、doが存在すると、それらの動作のほとんどを単純なRubyで実装することは完全に可能です。 Rubyのオープンクラスのおかげで、それらのクラスの非常にベアボーン版だけが必要です。あなたは後で欠けている機能を追加することができます。あなたの例では
、class Class
は、ランタイム環境によって私たちに与えられた既存クラスClass
を、再開され、Class
という名前の新しいクラスを作成していません。
だから、プレーンなRubyでClass#new
のデフォルトの動作を説明するために完全に可能である:
class Class
def new(*args, &block)
obj = allocate # another magic thing that cannot be explained in Ruby
obj.initialize(*args, &block)
return obj
end
end
[注意:実際には、initialize
はプライベートですので、あなたはアクセス制限を回避するためにobj.send(:initialize, *args, &block)
を使用する必要があります。]
BTW:Class#allocate
は、これらの魔法のものです。これはRubyのオブジェクト空間に新しい空のオブジェクトを割り当てます。これはRubyでは実行できないものです。したがって、Class#allocate
は、ランタイムシステムによっても提供されなければならないものです。
'Class.class#=> Class' – Flexoid
これはすべての方法で亀です! –
[The class/object paradox confusion](http://stackoverflow.com/questions/7675774/the-class-object-paradox-confusion)も参照してください。 –