代码之家  ›  专栏  ›  技术社区  ›  Jamison Dance

我可以从模块内部添加到类定义吗?

  •  1
  • Jamison Dance  · 技术社区  · 14 年前

    module Hah
      class String
        def hurp
          "hurp durp"
        end
      end
    end
    #make sure the file containing the module is loaded correctly.
    puts "Yup, we loaded"
    
    #separate file
    include Hah
    "foobar".hurp
    #should be "hurp durp"
    

    我知道包含模块的文件加载正确,因为 puts 包含文件时正确打印,但出现错误:

    undefined method `hurp' for "foobar":String
    

    那我该怎么做呢?

    1 回复  |  直到 14 年前
        1
  •  3
  •   yfeldblum    14 年前
    module Hah
      class String
        #...
      end
    end
    

    大致相当于:

    class Hah::String
      #...
    end
    

    使一个班级 Hah::String String 在全局命名空间中。注意,后者只有在 module Hah 已经声明 module 关键字, Module.new 模块Hah 然后在该范围内声明或重新打开 class String 在上下文中,它是隐式的 class Hah::String

    开课 在全局命名空间中,使用:

    module Hah
      class ::String
        #...
      end
    end
    

    因为 ::String 引用类 严格在顶级/全局命名空间中。