ruby - Ruby 1.9 中的 ARGF.class 是什么?

标签 ruby class ruby-1.9

在 Ruby 1.8.7 中,the documentation不在类和模块下列出 ARGF,并且 ARGF 不是类或模块:

ARGF.class # => Object

在 Ruby 1.9.3 中,the documentation在类和模块下有 ARGF,但我看到了这个:

ARGF.class # => ARGF.class
ARGF.superclass # => NoMethodError: undefined method `superclass' for ARGF:ARGF.class
ARGF.class.superclass # => Object
  • 为什么 Ruby 1.9 文档将 ARGF 放置为类,而实际类是其他东西?或者它们是同一回事?
  • ARGF.class 是元类、虚拟类、单例类还是其他?

最佳答案

ARGF 是用 C 实现的,您可以在其中做一些奇怪的事情。 ARGF 类首先在那里定义。它没有设置为 Ruby 中的任何常量,但其名称设置为“ARGF.class”。 然后 ARGF 常量被设置为该类的一个实例。

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);

这是一个 Ruby 代码,它做的事情大致相同。

argf_class = Class.new
def argf_class.name
  "ARGF.class"
end
argf = argf_class.new
ARGF = argf

在Ruby里看起来不太合理,但是在C里没问题。虽然,我认为该类可以设置为 ARGFClass,如 NilClassTrueClassFalseClass,因此它是不混淆。

我不知道变化的历史。我认为 Ruby 核心人员希望将 ARGF 放入文档中,这是最简单的方法。 (RDoc 无法显示单例对象的文档。)

关于ruby - Ruby 1.9 中的 ARGF.class 是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12274652/

相关文章:

python - 派生类是否自动拥有基类的所有属性?

python - 如何从类方法外部访问类方法内部的变量?

ruby-on-rails - 在 Ruby 1.9 中使用 instance_eval 进行常量查找

ruby-on-rails - 我如何在 rake 中使用助手?

java - 实现一个负责创建和存储对象的 "manager"类

ruby-on-rails - Rails - 如何将 .new/.save 更改为 .create

ruby - 嵌套数组的功能展开

带有字符串参数的 Ruby grep

ruby-on-rails - 如何通过在 Ruby 中传递一个 block 来拯救?

ruby - 如何搜索二进制文件并用 Ruby 替换字符串?