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