分享 坑爹啊!Rails 里面发现 String.gsub! 方法的 Bug

huacnlee · 2011年11月30日 · 最后由 huacnlee 回复于 2012年02月04日 · 4407 次阅读

比如这样的代码

a = "foo 123"
a.gsub!(/([\d]+)/) do
  "bar #{$1}"
end

应该得到 "foo bar 123" 但是到了 Rails (包括 3.1.x) 里面就有 Bug 了,$1 取不到东西,而得到 "foo bar "

https://github.com/rails/rails/issues/3496

[gitlabhq] be rails console                 21:46:10  ☁  master ☂ ⚡
Loading development environment (Rails 3.1.1)
1.9.2p290 :001 > a = "foo 123"
 => "foo 123" 
1.9.2p290 :002 > a.gsub!(/([\d]+)/) do
1.9.2p290 :003 >       "bar #{$1}"
1.9.2p290 :004?>   end
 => "foo bar 123"

好像没有你这个问题。是不是被你哪里 monkey patch 掉了。

#1 楼 @Saito 到了 Rails 里面因为有了 AcitveSupport::SafeBuffer 而引起的

这……不就把 gusb! 废掉了

额,这都被你发现了

#3 楼 @Rei 看 Ruby China 的 topics_helper,里面有个 String.new 的做法,虽然比较丑陋的写法,但是能暂时解决一下问题; 此外,如果是用 str.gsub(//,'\1') 这样的替换方式的话,是没有问题的,只是 $1, $2 ... 这些有问题

需要 登录 后方可回复, 如果你还没有账号请 注册新账号