【问题标题】:Add method to base class in the context of module在模块的上下文中向基类添加方法
【发布时间】:2013-02-13 18:07:04
【问题描述】:

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

【问题讨论】:

    标签: ruby metaprogramming


    【解决方案1】:

    一种选择是使用:: 来确保您获取顶级字符串类:

    module A
      class ::String
        def my_own_method
          self.reverse
        end
      end
    end
    
    "some string".my_own_method # => "gnirts emos"
    

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

    【讨论】:

      【解决方案2】:

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

      module A
        String.class_eval do
          def my_own_method
            self.upcase
          end
        end
      end
      
      
      'foo'.my_own_method # => "FOO"
      

      但如果我是你,我会在全局范围内打开一个 String 类(你的第一个 sn-p)。我真的不明白为什么不这样做。

      【讨论】:

      • 谢谢,它有效!但从 BaronVonBraun 发布的代码中,我可以看出问题在于范围。
      猜你喜欢
      • 1970-01-01
      • 2023-02-01
      • 1970-01-01
      • 2018-06-30
      • 2015-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-21
      相关资源
      最近更新 更多