如果我们只使用纯 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 值显式设置为 return 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
类的单例实例。
参考