ruby - 向命名空间中的字符串添加方法

标签 ruby metaprogramming

我正在 String 上定义一些新方法。我需要确保这些方法不与其他库中定义的方法冲突(作为引用,我创建了一个变形器,然后将 pluralizesingularize 添加到 String)。

我的第一个想法是像这样将新内容包装在一个模块中:

module MM
  class String
    def rev
      self.split('').reverse.join('')
    end
  end
end

class Test
  include MM

  def me(s)
    s.rev
  end
end

puts Test.new.me('this is a test')

但这当然行不通。 String#rev 仍未定义。我的代码中真正拥有的是一个模块 MM,除了内置类型扩展之外的所有内容都包含在 MM 中。我的目标是让 String 拥有 revsingularizepluralize 等方法,但仅限于该模块内部,MM.

这看起来应该是可行的。但不知何故,我错过了使它成为现实的 secret 咒语。

如果有人能提供一些建议,我们将不胜感激。

最佳答案

您正在寻找“改进”。它们是 Ruby 2.0 中的一项实验性功能,因此如果您不使用 2.0,您可能会倒霉。我自己还没有使用过它们,但是您的示例几乎是改进的规范用例。使用 refineusing 关键字来获得您想要的行为:

module MM
  refine class String
    def rev
      self.split('').reverse.join('')
    end
  end
end

class Test
  using MM

  def me(s)
    s.rev
  end
end

puts Test.new.me('this is a test')

关于ruby - 向命名空间中的字符串添加方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15235199/

相关文章:

c++ - 将非专用模板作为模板参数传递

c++ - 成员数量可变的结构或类

ruby-on-rails - Ruby on Rails Form_for 错误

ruby - 在没有 Rails 的情况下使用 Twilio/XML

ruby - ruby 的 StringIO 类到底是什么?

Ruby - 从符号转换为变量

ruby - 使用 Ruby 为无服务器框架编写授权者

Ruby:使用 join 和 ThreadsWait.all_waits 等待所有线程完成 - 有什么区别?

c++ - 使用 mpl::vector 作为函数表