ruby – 基本元编程:使用模块扩展现有类?

我希望我的模块的一部分扩展String类.

这不起作用

module MyModule
  class String
    def exclaim
      self << "!!!!!"
    end
  end
end

include MyModule

string = "this is a string"
string.exclaim

#=> NoMethodError

但这样做

module MyModule
  def exclaim
    self << "!!!!!"
  end
end

class String
  include MyModule
end

string = "this is a string"
string.exclaim

#=> "this is a string!!!!!"

我不希望MyModule的所有其他功能都在String中.在最高级别再次包括它似乎很难看.当然有一种更简洁的方法吗?

解决方法

第一个示例中的exclaim方法是在名为MyModule :: String的类中定义的,该类与标准String类无关.

在您的模块中,您可以打开标准的String类(在全局命名空间中),如下所示:

module MyModule
  class ::String
    # ‘Multiple exclamation marks,’ he went on,shaking his head,# ‘are a sure sign of a diseased mind.’ — Terry Pratchett,“Eric”
    def exclaim
      self << "!!!!"
    end
  end
end

相关文章

以下代码导致我的问题: class Foo def initialize(n=0) @n = n end attr_accessor :n d...
这是我的spec文件,当为上下文添加测试“而不是可单独更新用户余额”时,我得到以下错误. require 's...
我有一个拦截器:DevelopmentMailInterceptor和一个启动拦截器的inititializer setup_mail.rb. 但我想将...
例如,如果我有YAML文件 en: questions: new: 'New Question' other: recent: ...
我听说在RSpec中避免它,let,let !,指定,之前和主题是最佳做法. 关于让,让!之前,如果不使用这些,我该如...
我在Rails中使用MongoDB和mongo_mapper gem,项目足够大.有什么办法可以将数据从Mongoid迁移到 Postgres...