为什么这不起作用?
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。如果我删除模块包装器,它就可以工作。
答案 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
。