Ruby:从模块中重新打开类
为什么这样不行Ruby:从模块中重新打开类,ruby,class,syntax,structure,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。如果我移除模块包装器,它就可以工作。您定义的是XT::Fixnum,而不是Fixnum。您定义的是XT::Fixnum,而不
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。如果我移除模块包装器,它就可以工作。您定义的是XT::Fixnum,而不是Fixnum。您定义的是XT::Fixnum,而不是Fixnum。正如@Jeremy所写的,常量是由模块命名的,定义一个类实际上只是将一个类对象分配给一个常量。基本上
class Fixnum; end
大致相当于
Fixnum = Class.new
但如果Fixnum已经存在,前者将重新打开它,而后者将覆盖它
这意味着,如果在模块或类内部执行此操作,因为类是一个模块,所以常量Fixnum将在该模块内命名
如果要显式访问顶级常量,可以告诉Ruby从顶级开始查找,其方式与告诉Unix从顶级开始文件系统查找非常类似:
module XT
class ::Fixnum; end
end
正如@Jeremy所写的,常量是由模块命名的,定义一个类实际上就是将一个类对象分配给一个常量。基本上
class Fixnum; end
大致相当于
Fixnum = Class.new
但如果Fixnum已经存在,前者将重新打开它,而后者将覆盖它
这意味着,如果在模块或类内部执行此操作,因为类是一个模块,所以常量Fixnum将在该模块内命名
如果要显式访问顶级常量,可以告诉Ruby从顶级开始查找,其方式与告诉Unix从顶级开始文件系统查找非常类似:
module XT
class ::Fixnum; end
end