Существует ли рубиновая идиома для, "Если делают - это", и "делает - это" так же, как простая команда?
например, я в настоящее время делаю
object.method ? a.action : nil
для отъезда выражения else пустым, но я чувствую, что существует, вероятно, более идиоматический способ сделать это, которое не включает необходимость указать ноль в конце. (и альтернативно, я испытываю желание поднимать несколько строк кода, было бы расточительно в этом случае.
Ответ Грега - лучший, но для записи, и даже больше, чем на 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 практически никогда не понадобится. Причина, по которой вам это нужно в C, заключается в том, что в C if
является оператором, поэтому, если вы хотите вернуть значение, у вас есть для использования тернарного оператора, который является выражением .
В Ruby все является выражением, там нет операторов, что делает тернарный оператор в значительной степени излишним. Вы всегда можете заменить
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