比如这样的代码
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! 废掉了
额,这都被你发现了
fxn 提供了这条线索啊: https://github.com/rails/rails/issues/1555
#3 楼 @Rei 看 Ruby China 的 topics_helper,里面有个 String.new 的做法,虽然比较丑陋的写法,但是能暂时解决一下问题; 此外,如果是用 str.gsub(//,'\1') 这样的替换方式的话,是没有问题的,只是 $1, $2 ... 这些有问题