Bye Bye Moore

猫マンション建築の野望を胸に零細事業主として資本主義の荒波に漕ぎ出したアラサー男の技術メモ

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

やったぜ