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

Mik*_*yth 1 ruby syntax structure class

为什么这不起作用?

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
Run Code Online (Sandbox Code Playgroud)

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

Jör*_*tag 6

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

class Fixnum; end
Run Code Online (Sandbox Code Playgroud)

是(大致)相当于

Fixnum = Class.new
Run Code Online (Sandbox Code Playgroud)

(除非事实如果Fixnum已经存在,前者将重新打开它,而后者将覆盖它).

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

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

module XT
  class ::Fixnum; end
end
Run Code Online (Sandbox Code Playgroud)