ruby - 创建一个 Gem,向核心类添加方法

标签 ruby

我正在创建一个 gem,它向 String 类添加一个新方法。例如,如果我正在创建一个在 String 上添加 to_foobar 的方法,我知道我可以简单地执行以下操作:

class String
  def to_foobar
    # ...
  end
end

但是这是正确的方法还是有更好的方法?

最佳答案

我更愿意

# my_gem/lib/my_gem/core_extensions/string.rb

module MyGem::CoreExtensions::String
  def to_foobar
    # ...
  end
end

class String
  include MyGem::CoreExtensions::String
end

这样,如果我收到一条提到 String#to_foobar 的错误消息,我就不必怀疑“等等,String 没有 to_foobar 方法,它来自哪里?”我只能说

String.ancestors
# => [String, MyGem::CoreExtensions::String, Comparable, Object, Kernel]

瞧,祖先链中有这个看起来可疑的模块,按照标准 Ruby 命名约定,它可能位于 my_gem/lib/my_gem/core_extensions/string.rb 中。

或者,我可以说

''.method(:to_foobar).owner
# => MyGem::CoreExtensions::String

并真正得到有意义的答案。

当然

''.method(:to_foobar).source_location
# => ['my_gem-0.0.1/lib/my_gem/core_extensions/string.rb", 4]

始终有效。

关于ruby - 创建一个 Gem,向核心类添加方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10972198/

相关文章:

ruby-on-rails - Rails 4. 模型中的国家/地区验证

ruby - 如何为 Ruby 编写猴子补丁?

ruby - 等于或等于语法

ruby - Mechanize 如何在我手动结束脚本之前保持 session ?

ruby 鞋子 : counting the amount of times a value occurs in an Array

xml - 如何用nokogiri解析xml文件并将结果放入新文件中?

ruby - rbenv install - 需要可执行主机 ruby

ruby - Cocoapods "Pod Update"- 异常

ruby-on-rails - 为什么会出现 NameError : uninitialized constant simply making a rake db:create on a new machine

ruby-on-rails - hash.delete_if { |键,值| true } 不删除...为什么?