创建一个向核心类添加方法的Gem

时间:2012-06-10 20:39:44

标签: ruby

我正在创建一个为String类添加新方法的gem。例如,如果我创建了一个在to_foobar上添加String的方法,我知道我可以这样做:

class String
  def to_foobar
    # ...
  end
end

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

2 个答案:

答案 0 :(得分:5)

我更喜欢

# 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]

Etvoilà,在祖先链中存在这个可疑的模块,遵循标准的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]

始终有效。

答案 1 :(得分:0)

是的,这完全没问题。如果您不知道如何从头开始构建宝石,我建议您查看jeweler