Ray*_*oal 29 ruby class ruby-1.9
在Ruby 1.8.7中,文档没有ARGF在类和模块下列出,ARGF也不是类或模块:
ARGF.class # => Object
Run Code Online (Sandbox Code Playgroud)
在Ruby 1.9.3中,文档有ARGF类和模块,但我看到了:
ARGF.class # => ARGF.class
ARGF.superclass # => NoMethodError: undefined method `superclass' for ARGF:ARGF.class
ARGF.class.superclass # => Object
Run Code Online (Sandbox Code Playgroud)
ARGF在实际的类是什么时才作为一个类?或者他们是一回事吗?ARGF.class元类,虚拟类,单例类还是别的什么?Sim*_*tsa 27
ARGF在C中实现,你可以做一些奇怪的事情.所述ARGF类首先被定义在那里.它没有设置为Ruby中的任何常量,但其名称设置为"ARGF.class".然后将ARGFconstant设置为该类的实例.
rb_cARGF = rb_class_new(rb_cObject);
rb_set_class_path(rb_cARGF, rb_cObject, "ARGF.class");
/* ... */
argf = rb_class_new_instance(0, 0, rb_cARGF);
rb_define_global_const("ARGF", argf);
Run Code Online (Sandbox Code Playgroud)
这是一个大致相同的Ruby代码.
argf_class = Class.new
def argf_class.name
"ARGF.class"
end
argf = argf_class.new
ARGF = argf
Run Code Online (Sandbox Code Playgroud)
它在Ruby中看起来不合理,但在C中它很好.虽然,我认为这个类可以设置为ARGFClass一样NilClass,TrueClass,FalseClass,所以它不是混乱.
我不知道改变的历史.我认为Ruby核心人员想ARGF进入文档,这是最简单的方法.(RDoc无法显示单例对象的文档.)
这似乎是正确的,ARGF不是一个类或一个模块.
class ARGF
end
# => TypeError: ARGF is not a class
module ARGF
end
# => TypeError: ARGF is not a module
Run Code Online (Sandbox Code Playgroud)
ARGF类下的文档列表,但除此之外,它并没有说它是一个类.可能,它并不打算ARGF作为一个类处理,并且文档列出的是错误的.这是文档的错误.
看起来ARGF如果某个类的唯一实例缺少一个文字,并且唯一的方法就是调用它ARGF.class.
ARGF.class.class
# => Class
ARGF.class.ancestors
# => [ARGF.class, Enumerable, Object, Kernel, BasicObject]
Run Code Online (Sandbox Code Playgroud)
类和它的实例之间的通常关系适用于ARGF.class和ARGF.
ARGF.is_a?(ARGF.class)
# => true
ARGF.kind_of?(ARGF.class)
# => true
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2350 次 |
| 最近记录: |