オブジェクトをキャプチャし、純粋なRubyだけを使用してそれらを見ると、いくつかのことがわかります。
1.9.3 (Object#main):0 > ARGFClass = ARGF.class
=> ARGF.class
1.9.3 (Object#main):0 > ARGFClass.name
=> "ARGF.class"
1.9.3 (Object#main):0 > ARGFClass.class
=> Class
1.9.3 (Object#main):0 > ARGFClass.superclass
=> Object
1.9.3 (Object#main):0 > ARGFClass.ancestors
=> [ARGF.class,
Enumerable,
Object,
JSON::Ext::Generator::GeneratorMethods::Object,
PP::ObjectMixin,
Kernel,
BasicObject]
何らかの理由で、開発者はclass.name値を明示的に設定して、を返しますARGF.class
。これは一般的には一般的ではありませんが、Rubyの内部で、直接アクセスしてはならない定数に使用されます。
他のクラスとまったく同じように、ARGFClassを使用してオブジェクトをインスタンス化できます。これは、それが実際のRubyクラスであることを意味します。
1.9.3 (Object#main):0 > argfinstance = ARGFClass.new
=> ARGF
1.9.3 (Object#main):0 > argfinstance.inspect
=> "ARGF"
#newを呼び出すと、シングルトンが返されるだけではありません。
1.9.3 (Object#main):0 > argfinstance == ARGF
=> false
1.9.3 (Object#main):0 > argfinstance.object_id
=> 70346556507420
1.9.3 (Object#main):0 > ARGF.object_id
=> 70346552343460
Ruby開発者はARGF.class
、名前で直接参照できないように意図的に名前を付けていますが、これは実際のクラスでARGF
あり、実際のオブジェクトです。
IOオブジェクトと同じメソッドがたくさんあり、実際にはio.c
ソースファイルで定義されています。また、Enumerableモジュールが混在しているため、すべてのeach / inject/map機能をサポートします。
編集:ドキュメントはARGF
クラスとしてリストされています。ただし、実際には、奇妙な名前ARGF.class
のクラスのシングルトンインスタンスを参照する定数です。
参考文献