Rubyのcase式のたくさんの使い方(翻訳)
Ruby Case Statements with Examples
英語の練習のための翻訳
以下翻訳
if / elsif
式を使うときはいつでも代わりにRubyのcase式を使うことを考慮してください。この投稿ではいくつかのユースケースと実際にどのようになっているか見てみましょう。
ノート: 他のプログラミング言語ではswitch式として知られています
Rub Case & Range
case
式は初めて見た時よりももっと柔軟です。値がどの範囲に落ちるかによってメッセージを表示する例を見てみましょう。
case capacity when 0 "You ran out of gas." when 1..20 "The tank is almost empty. Quickly, find a gas station!" when 21..70 "You should be ok for now." when 71..100 "The tank is almost full." else "Error: capacity has an invalid value (#{capacity})" end
このコードはif / elsif
版と比べてけっこうエレガントに見えると思います。
Ruby Case & Regex
when
の条件に正規表現を使うこともできます。以下は商品を消費するのがどのくらい危険かを知らせる最初の文字を持つserial_code
の例です。
case serial_code when /\AC/ "Low risk" when /\AL/ "Medium risk" when /\AX/ "High risk" else "Unknown risk" end
Ruby Caseを使わない時
単純な1対1のマッピングの時はこのように書きたくなるかもしれません。
case country when "europe" "http://eu.example.com" when "america" "http://us.example.com" end
個人的には代わりにこっちの方が良いと思います。
SITES = { "europe" => "http://eu.example.com", "america" => "http://us.example.com" } SITES[country]
ハッシュによる解決法は使う上でより効率的で簡単だと思いませんか?
===メソッドではどうなるか
あなたはcase
が内部でどう動いているか不思議に思うかもしれません。最初の例に戻ったとして、これが起こっていることです。
(1..20) === capacity (21..70) === capacity (71..100) === capacity
見ての通り、Rubyはオブジェクトを左側にして===
を呼んでいるので、条件は逆転しています。===
はどのクラスにも実装されているただのメソッドです。この場合、Range
はこのメソッドをその範囲に値が見つかった時にのみtrueを返すように実装しています。
これはRubiniumでどのように(Range
クラスに)===
が実装されているかです。
def ===(value) include?(value) end
ソース: https://github.com/rubinius/rubinius/blob/master/kernel/common/range.rb#L178
Procs + Case
もう一つの~===を実装している面白いクラスは
Proc`クラスです。
procsとlambdas*については来たる講座: 'Ruby Deep Dive'で学べます。 無料のレッスンを受けるにはここをクリック
この例では2つのprocs
を定義し、ひとつはeven
な数字か、もうひとつはodd
かをチェックします。
odd = proc(&:odd?) even = proc(&:even?) case number when odd puts "Odd number" when even puts "Even number" end
これが本当に起こることです。
odd.===(number) even.===(number)
procで===
を使うことはcall
を使うことと同じ効果です。
結論
あなたはRubyのcase式がどのように動き、どれほどそれが柔軟になれるかを学びました。今こそあなた自身のプロジェクトでそのベストな利用を始める番です。この記事があなたの役に立ちますように!
この投稿が多くの人が学べるようにシェアしてください。
翻訳ここまで。
今回は意訳多めにしました。句の修飾の順番が日本語と違ってなかなか正しい訳をするのは難しいです。