web-dev-qa-db-ja.com

Ruby if .. elsIf .. else on single line?

Ruby三項演算子を使用すると、単純なif else構造の次のロジックを記述できます。

a = true  ? 'a' : 'b' #=> "a"

しかし、これをif foo 'a' elsif bar 'b' else 'c'

次のように書くこともできますが、それに従うのは少し難しいです。

foo = true
a = foo  ? 'a' : (bar ? 'b' : 'c') #=> "a"

foo = false
bar = true
a = foo  ? 'a' : (bar ? 'b' : 'c') #=> "b"

そのようなシナリオを処理するためのより良いオプションはありますか、if..elsif..elseロジックを単一行に凝縮したい場合、これが最善の策ですか?

22
Noz
a = (foo && "a" or bar && "b" or "c")

または

a = ("a" if foo) || ("b" if bar) || "c"
44
sawa

Github Ruby Styleguide は、ささいなif/elseステートメント用に1つのライナーを予約し、ネストされた三項演算子を避けることを推奨しています。thenキーワードですが、それは悪い習慣と見なされます。

if foo then 'a' elsif bar then 'b' else 'c' end

制御ステートメントが非常に複雑である場合は、ケース(Rubyのスイッチ演算子)を使用できます。

16
sunnyrjuneja

a = if foo then 'a' elsif bar then 'b' else 'c' end

4
tjmw

また書くことができます:

x = if foo then 'a' elsif bar then 'b' else 'c' end

ただし、これはRubyの慣用的なフォーマットではありません。

3
tokland