Just do IT

思うは招く

Ruby基礎問題100本ノック#21 正規表現と文字列とcapitalize

お題

アルファベットとハイフンからなる文字列を与えられると、ハイフンで区切られた部分をcapitalizeするようなメソッドword_capitalizeを定義せよ。

引用:「たのしいRuby 第6版」P.364より

回答

def word_capitalize(str)
  ary = str.split(/\-/)
  ary.map(&:capitalize).join("-")
end

p word_capitalize("X-MAILER")
=> "X-Mailer"

p word_capitalize("in-reply-to")
=> "In-Reply-To"

説明

メソッドの引数には文字列をとることを想定し、strを設定。

splitメソッドの引数に-を渡し、「ハイフンで文字列を区切って配列に入れて」と命令。なおハイフンだけでは認識されないため、バックスラッシュを入れてハイフンをエスケープしている。

生成した配列はこんな感じの中身になっている。

ary = str.split(/\-/)
=> ["in", "reply", "to"]

それぞれの要素を取り出し、最初の文字列を大文字にするcapitalizeメソッドを使う。ちなみに最初の文字だけ大文字にして、その他は小文字にする。 capitalize, capitalize! (String) - Rubyリファレンス

["in", "reply", "to"].map(&:capitalize)
=> ["In", "Reply", "To"]

なお、map(&:capitalize)は以下の文の省略形。

~.map { |m| m.capitalize }

最後に、これらの配列をjoinメソッドでくっつける。引数にハイフンを与えて、要素同士をハイフンで区切る。

ary.map(&:capitalize).join("-")
=> "In-Reply-To"

「たのしいRuby 第6版」の回答とほぼ同じだったので嬉しかった。