The Many Uses Of Ruby Case Statements

いくつかのif / elsifステートメントを使用する必要があるときは、代わりにRuby caseステートメントを使用することを検討することができます。

ruby case

Note: 他のプログラミング言語では、これはswitch文として知られています。

Rubyでのcase文の構成要素です。

Keyword Description
case case文の定義を開始します。
when マッチするすべての条件は1つのwhen文です。
else 何もマッチしなければこれを実行します。 任意です。

Ruby Case & Ranges

case ステートメントは、一見しただけではわからないほど柔軟性があります。

case capacitywhen 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の場合 & Regex

正規表現をwhenの条件として使用することもできます。

case serial_codewhen /\AC/ "Low risk"when /\AL/ "Medium risk"when /\AX/ "High risk"else "Unknown risk"end

Rubyケースを使用しない場合

単純な1対1のマッピングの場合、次のようなことをしたくなるかもしれません。

case countrywhen "europe" "http://eu.example.com"when "america" "http://us.example.com"end

私の意見では、代わりに次のようにした方が良いと思います:

SITES = { "europe" => "http://eu.example.com", "america" => "http://us.example.com"}SITES

ハッシュソリューションは、より効率的で作業しやすいです。

ケースの仕組み: ===メソッド

caseがフードの中でどのように動くのか気になるかもしれません。 最初の例に戻ると、次のようなことが起こっています。

(1..20) === capacity(21..70) === capacity(71..100) === capacity

見てわかるように、Ruby は左のオブジェクトに対して ======Rangeは、値が範囲内で見つかった場合のみtrueを返すことで、このメソッドを実装しています。

Rubiniusでは、===Rangeクラスの場合):

def ===(value) include?(value)end

ソースを見てみましょう。 https://github.com/rubinius/rubinius/blob/master/core/range.rb#L178

Procs + Case

===Procクラスです。

関連記事です。 プロックについて詳しくはこちら & ラムダ。

この例では、2つのprocsevenoddをチェックするようにしています。

odd = proc(&:odd?)even = proc(&:even?)case numberwhen odd puts "Odd number"when even puts "Even number"end

これは実際に起こっていることです。

odd.===(number)even.===(number)

proc に ===call を使用するのと同じ効果があります。

おわりに

Rubyのcase文がどのように機能し、どれほど柔軟性があるかを学びました。

この記事がお役に立てば幸いです。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です