Ответ 1
a = (foo && "a" or bar && "b" or "c")
или
a = ("a" if foo) || ("b" if bar) || "c"
С рубиновым тернарным оператором мы можем написать следующую логику для простой конструкции 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..sel..else логику в одну строку?
a = (foo && "a" or bar && "b" or "c")
или
a = ("a" if foo) || ("b" if bar) || "c"
Github Ruby Styleguide рекомендует, чтобы один лайнер был зарезервирован для тривиальных операторов if/else и чтобы избежать вложенных троичных операторов. Вы можете использовать ключевое слово then
, но это считается плохой практикой.
if foo then 'a' elsif bar then 'b' else 'c' end
Вы можете использовать случаи (оператор рубинового переключателя), если слишком сложно определить свои контрольные утверждения.
a = if foo then 'a' elsif bar then 'b' else 'c' end
Вы также можете написать:
x = if foo then 'a' elsif bar then 'b' else 'c' end
Однако это не идиоматическое форматирование в Ruby.