ご存知のように、case…when は Ruby でプログラミングをする際によく使われる構文の一つです。
しかし、この構文の使い方は非常に多岐にわたるため、その動作の本質を理解していないと戸惑いを感じてしまうかもしれません。
この記事では、case…when の動作の本質と、この構文を自分なりに使いこなすための応用方法について簡潔に共有します。
一般的な使用例:
1.1. 完全な形式
case grade
when 'A'
p 'Good'
when 'B'
p 'Good'
when 'C'
p 'OK'
else
p 'Try harder'
end
1.2. 値の省略形式
case
when weather == 'rain'
p 'I love that'
when bank_amount > 99999999999999999999999999999999999
p "I'm rich"
else
p 'Hmmm'
end
1.3. 複数値の形式
case grade
when 'A', 'B'
p 'Good'
when 'C'
p 'OK'
else
p 'Try harder'
end
1.4. 特殊な形式
もっと珍しい形式を見ていきましょう!
case 'hello'
when /ello/
p 'Oh hi'
when /\\d*/
p 'I am sorry'
end
object = Staff.new ....
case object
when Customer
p 'Hello customer'
when Staff
p 'Hello staff'
else
p 'Hello'
end
case 4
when 1..5
p 'Low'
when 6..10
p 'Good'
else
p 'Hmmm...'
end
2. 動作の本質
セクション1.4の例を見ると、case…when が通常の比較演算(==)を使用していないことがわかります。
この理由は、case…when が case-equality(=== 演算子による比較)を使用しているためです。
より分かりやすく言うと、最初の例は以下のように解釈されているとイメージしてください:
case grade
if 'A' === grade
p 'Good'
elsif 'B' === grade
p 'Good'
elsif 'C' === grade
p 'OK'
else
p 'Try harder'
end
case-equality(ケース等価性)は何を意味するのか?
実際にはオブジェクトの種類によって実装方法は異なりますが、その多くは以下のような意味合いで実装されています:
例えば a === b は、単純に「a を一つの集合(セット)と見なした場合、b はその要素(メンバー)であるか?」と理解することができます。
具体的には:
(1..5) === 2 #true
(1..5) === 3 #true
(1..5) === 6 #false
Integer === 100 #true
Integer === 'hello' #false
/ello/ === 'hello' #true
case…when が === を使用して条件を確認しているという仕組みを理解すれば、先ほど挙げた特殊な例もより明確になるはずです。
3. 実践的な応用
どんな構文であっても、その動作を真に習得するには、実際に使ってみる必要があります。
実務への応用方法は多岐にわたりますが、特に「要素がある値の集合のいずれかに合致するか」という条件を確認したい場合に非常に有効です。
以下の例では、ステータスコードに基づいて HTTP レスポンスが成功したかどうかを判定する例を見てみましょう。
class SuccessRequest
def self.=== response
200 <= response.status < 300
end
end
case http_response
when SuccessRequest
p 'Nice'
when ...
...
この構文に関する共有が、皆さんの独学の過程や日々の業務での実践に役立つことを願っています。
もし何か質問や疑問があれば、遠慮なくコメント欄に残してください。
そして、これからも私たちの次回の共有記事を楽しみにしていてくださいね!