お題
アルファベットとハイフンからなる文字列を与えられると、ハイフンで区切られた部分を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版」の回答とほぼ同じだったので嬉しかった。