gsub(pattern, replace)
はpattern
にマッチする部分をすべてreplace
に置き換えてくれる便利メソッドです。pattern
として正規表現、replace
として文字列をそれぞれ指定することが多いと思いますが、実はブロックを持つこともでき__「pattern
でひっかけた部分をこねくりまわしてreplace
にしたい」__というときにはとても便利です。
たとえば英数字からなる文字列のうち、aとcだけをすべて大文字にする場合は次のように書くことができます。
p "1a2b3c".gsub(/[ac]/){|ch| ch.upcase} #=> "1A2b3C"
余談ですが、Rubyでは「暗黙のProc化」とでもいうべき裏機能(?)があります。これは&obj
のようにアンパサンドを先頭に付与した場合、それに続くobj
をProc
として扱おうとするというもので、なかでも&:symbol
のよう「アンパサンド + Symbol
」という組合せはよく使われます。
たとえば文字列配列の中身をすべて整数に変換したい場合、この「暗黙のProc化」を利用して次のように書くことができます。
words = ["1", "2", "3"]
p words.map{|ch| ch.to_i} #=> [1, 2, 3]
p words.map(&:to_i) #=> [1, 2, 3]
この例ではmap
メソッドのブロックを&:to_i
で代用しています。ブロックありのgsub
もこれと同じにようにブロックを省略し、「暗黙のProc」で代用することができます。つまり最初の例は次のようにもかけてしまうということになります。
p "1a2b3c".gsub(/[ac]/, &:upcase) #=> "1A2b3C"
ブロックをわざわざ書く必要がない分、とてもらくちんですね(`・ω・´)シャキーン