Ruby:从模块中重新打开一个类

时间:2010-12-23 10:47:20

标签: ruby class syntax structure

为什么这不起作用?

module XT
  puts Fixnum.class  # So we're sure to re-open the Fixnum class
  class Fixnum
    def hi
      puts "HI from module XT"
    end
  end
end

在要求并加载模块后,hi方法仍未添加到Fixnum。如果我删除模块包装器,它就可以工作。

2 个答案:

答案 0 :(得分:6)

正如@Jeremy所写,常量是由模块命名的,定义一个类实际上只是将一个类对象赋给一个常量。基本上,

class Fixnum; end

(大致)等同于

Fixnum = Class.new

(如果Fixnum已经存在,前者将重新打开,而后者将覆盖它)。

这意味着如果您在模块(或类,因为类IS-A模块)内部执行此操作,则常量Fixnum将在该模块内进行命名空间。

如果你想显式访问一个顶级常量,你可以告诉Ruby在顶层开始查找,就像你告诉Unix如何在顶层启动文件系统查找一样:

module XT
  class ::Fixnum; end
end

答案 1 :(得分:4)

您定义的是XT::Fixnum,而不是Fixnum