猴子修补Pathname#gsub实例方法

时间:2017-01-04 23:48:14

标签: ruby oop

如果查看Pathname的文档,则无法找到Pathname#gsub实例方法。但是有一个Pathname#sub

因此,当您尝试调用它时,您会收到(NoMethodError)

require 'pathname'

some_pathname = Pathname.new("path/with/two/path/occurances/")
p some_pathname.sub(/path/, 'foobar')
#=> #<Pathname:some/foobar/with/two/occurances/of/path>
p some_pathname.gsub(/path/, 'foobar')
# undefined method `gsub' (NoMethodError)

为什么不会Pathname使用gsub方法?看起来如果你有一个sub,你可能会有一个gsub

因为ruby有open classes,您可以monkey patch Pathname类,并添加gsub实例方法。

这就是我在下面所做的:

require 'pathname'

class Pathname
  def gsub(re, str)
    gsubbed_pn = self
    while gsubbed_pn.to_s =~ re
      gsubbed_pn = gsubbed_pn.sub(re, str)
    end
    gsubbed_pn
  end
end

monkey_pathname = Pathname.new("path/with/two/path/occurances")
p monkey_pathname.gsub(/path/, 'foobar')
#=> #<Pathname:foobar/with/two/foobar/occurances>
p monkey_pathname
#<Pathname:path/with/two/path/occurances>

但我已经读到monkey patching应该不是我达到的第一个工具。

在这种情况下有更好的选择吗? Pathname是否因设计缺少gsub方法?

0 个答案:

没有答案