With the ruby ternary operator we can write the following logic for a simple if else construct:
a = true ? 'a' : 'b' #=> "a"
But what if I wanted to write this as if foo 'a' elsif bar 'b' else 'c'
?
I could write it as the following, but it's a little difficult to follow:
foo = true
a = foo ? 'a' : (bar ? 'b' : 'c') #=> "a"
foo = false
bar = true
a = foo ? 'a' : (bar ? 'b' : 'c') #=> "b"
Are there any better options for handling such a scenario or is this our best bet if we wish to condense if..elsif..else logic into a single line?
a = (foo && "a" or bar && "b" or "c")
or
a = ("a" if foo) || ("b" if bar) || "c"
The Github Ruby Styleguide recommends that one liners be reserved for trivial if/else statements and that nested ternary operators be avoided. You could use the then
keyword but its considered bad practice.
if foo then 'a' elsif bar then 'b' else 'c' end
You could use cases (ruby's switch operator) if find your control statements overly complex.
a = if foo then 'a' elsif bar then 'b' else 'c' end
You can also write:
x = if foo then 'a' elsif bar then 'b' else 'c' end
However, this isn't idiomatic formatting in Ruby.
来源:https://stackoverflow.com/questions/13848780/ruby-if-elsif-else-on-a-single-line