Рубиновый тернарный оператор без остального
есть ли идиома ruby для "Если делать-это" и "делать-это" просто как простая команда?
например, я сейчас делаю
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' #=> возвращает результат последнего выражения, значение равно 1, поэтому и раздел будет оценен, и вернет 'one'.
value = 0 result = (value == 1 && 'one' ) || 'two' result #=> 'two'
объясняю: ценность != 1 и 'и' выражение не будет вычисляться, но вместо внесения будут использованы " или " выражение и возвращает значение 'два'
другой способ, которым это можно сделать в той же строке:
if object.method; a.action end
это считается плохим стилем Rubocop, потому что он использует точку с запятой для завершения выражения, но я нахожу его более читаемым в некоторых условиях, чем привязка к оператору if в конце. Легче пропустить оператор if в конце, и я не всегда хочу возвращать что-то, если условие не истинно(как вы вынуждены делать с тернарным оператором).
вы также можете быть немного больше подробные rubocop и дружелюбный:
if object.method then a.action end