Тройной оператор Ruby без else
есть ли идиома ruby для "If do-this" и "do-this" просто как простая команда?
например, в настоящее время я делаю
object.method ? a.action : nil
чтобы оставить предложение else пустым, но я чувствую, что, вероятно, есть более идиоматический способ сделать это, который не требует указания нуля в конце. (и, кроме того, я чувствую, что в этом случае было бы расточительно использовать несколько строк кода.
5 ответов
как общее правило: вам почти никогда не нужен тернарный оператор в Ruby. Причина, по которой вам это нужно в C, заключается в том, что в C if
является оператором, поэтому, если вы хотите вернуть значение, вы есть использовать тернарный оператор, который является выражением.
В Ruby, все есть выражение, там are нет утверждений, что делает тернарный оператор в значительной степени излишним. Ты всегда можешь заменить
cond ? then_branch : else_branch
С
if cond then then_branch else else_branch end
так, в вашем примере:
object.method ? a.action : nil
эквивалентно
if object.method then a.action end
что, как указывает @Greg Campbell, в свою очередь эквивалентно трейлингу if
форма модификатор
a.action if object.method
кроме того, поскольку логические операторы в Ruby не просто вернуть true
или false
, но значение последнего вычисленного выражения, вы можете использовать их для регулирования потока. Это идиома, импортированная из Perl, и будет выглядеть так:
object.method and a.action
ответ Грега лучший, но для записи, и даже больше, чем в C, выражения и утверждения эквивалентны в Ruby, так что кроме a.action if o.m?
вы также можете делать вещи, как:
object.method? && a.action
можно писать (a; b; c) if d
или даже
(a
b
c
) if d
или: (x; y; z) ? (a; b c) : (d; e; f)
в Ruby нет ситуации, когда разрешено только одно утверждение или выражение...
result = (<expression> && <true value>) || <false value>
value = 1
result = (value == 1 && 'one' ) || 'two'
result #=> 'one'
Поясните: value == 1 & & ' one '# = > возвращает результат последнего выражения, value равно 1 so и раздел будет оценен, и вернет 'one'.
value = 0
result = (value == 1 && 'one' ) || 'two'
result #=> 'two'
объясняю: ценность != 1 и " и " выражение не будет оцениваться, но instad будет использоваться "или" выражение, и оно возвращает "два"
другой способ, которым это можно сделать в той же строке:
if object.method; a.action end
это считается плохим стилем Rubocop, потому что он использует точку с запятой для завершения выражения, но я нахожу его более читаемым в некоторых условиях, чем галсирование оператора if в конце. Легче упустить оператор if в конце, и я не всегда хочу возвращать что-то, если условие неверно(как вы вынуждены с тернарным оператором).
вы также можете быть немного больше подробные rubocop и дружелюбный:
if object.method then a.action end