在模块的上下文中将方法添加到基类

时间:2013-02-13 18:07:05

标签: ruby metaprogramming

我想在Ruby中为String类添加一个自定义方法。我知道可以使用以下代码完成:

class String
  def my_own_method
    # impelementation comes here 
  end
end

如果我将该代码写入文件中说“string.rb”和其他地方,例如irb,我写require "string"然后它工作得很好,我可以访问任何字符串对象上的自定义方法。 但是,当我想将自定义代码打包到这样的模块中时会出现问题:

module A
  class String
    def my_own_method
      # implementation
    end
  end
end

然后当我包含模块(没有错误)时,我无法访问每个字符串对象上的方法,除非我通过调用s = A::String.new来直接实例化字符串。在这种情况下,我可以访问我的自定义方法,但仅限于 s 变量,而不是任何字符串对象。我该怎样做才能打包我的util类并自动将它们的方法添加到基类中?任何帮助都非常感谢。

2 个答案:

答案 0 :(得分:7)

一种选择是使用::来确保您抓住顶级String类:

module A
  class ::String
    def my_own_method
      self.reverse
    end
  end
end

"some string".my_own_method # => "gnirts emos"

我还必须同意塞尔吉奥在答案结束时的观点。不太确定是否需要这样做。

答案 1 :(得分:2)

嗯,首先,您可以使用class_eval

module A
  String.class_eval do
    def my_own_method
      self.upcase
    end
  end
end


'foo'.my_own_method # => "FOO"

但如果我是你,我会选择在全球范围内开设一个String课程(你的第一个片段)。我真的没有看到不这样做的原因。