Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

gsubの第二引数に特殊変数「$1」を仕込んでも動作しない場合、ブロックわたしに変更する

(1..4).each {|i| mtch = %r((\w{#{i}})); puts "hoge".gsub(mtch, $1)} 
TypeError: no implicit conversion of nil into String

な、なんでや!?
ブロックに入れてないときはちゃんと動いたのに!?

こんな時は公式情報をみます。
すると・・・

注意:

第 2 引数 replace に $1 を埋め込んでも意図した結果にはなりません。 この文字列が評価される時点ではまだ正規表現マッチが行われておらず、 $1 がセットされていないからです。

な、ナンダッテー!?

では早速、ブロックわたしをしてみましょう

(1..4).each {|i| mtch = %r((\w{#{i}})(\w*)); puts "hoge".gsub(mtch) {$1.upcase + $2 } }
#>>Hoge
#>>HOge
#>>HOGe
#>>HOGE

やったぜ