Подтвердить что ты не робот

Ruby if.. elsIf.. else на одной строке?

С рубиновым тернарным оператором мы можем написать следующую логику для простой конструкции 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 логику в одну строку?

4b9b3361

Ответ 1

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

или

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

Ответ 2

Github Ruby Styleguide рекомендует, чтобы один лайнер был зарезервирован для тривиальных операторов if/else и чтобы избежать вложенных троичных операторов. Вы можете использовать ключевое слово then, но это считается плохой практикой.

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

Вы можете использовать случаи (оператор рубинового переключателя), если слишком сложно определить свои контрольные утверждения.

Ответ 3

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

Ответ 4

Вы также можете написать:

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

Однако это не идиоматическое форматирование в Ruby.