4

我想在 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 类并自动将它们的方法添加到基类中?非常感谢任何帮助。

4

2 回答 2

7

一种选择是用于::确保您获取顶级 String 类:

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

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

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

于 2013-02-13T18:20:27.067 回答
2

好吧,一方面,您可以使用class_eval

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


'foo'.my_own_method # => "FOO"

但如果我是你,我会String在全球范围内开设一个课程(你的第一个片段)。我真的不明白为什么不这样做。

于 2013-02-13T18:10:58.647 回答