てくのろじーたのしー

Haskellぺろぺろ

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`クラスです。

procslambdas*については来たる講座: '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式がどのように動き、どれほどそれが柔軟になれるかを学びました。今こそあなた自身のプロジェクトでそのベストな利用を始める番です。この記事があなたの役に立ちますように!

この投稿が多くの人が学べるようにシェアしてください。

翻訳ここまで。

今回は意訳多めにしました。句の修飾の順番が日本語と違ってなかなか正しい訳をするのは難しいです。