如果查看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
方法?