Тернарный оператор Ruby без еще

Существует ли рубиновая идиома для, "Если делают - это", и "делает - это" так же, как простая команда?

например, я в настоящее время делаю

object.method ? a.action : nil

для отъезда выражения else пустым, но я чувствую, что существует, вероятно, более идиоматический способ сделать это, которое не включает необходимость указать ноль в конце. (и альтернативно, я испытываю желание поднимать несколько строк кода, было бы расточительно в этом случае.

73
задан sschuberth 29 March 2016 в 10:35
поделиться

3 ответа

a.action if object.method?
111
ответ дан 24 November 2019 в 12:06
поделиться

Ответ Грега - лучший, но для записи, и даже больше, чем на 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)

В Рубине нет ситуации, когда допускается только одно заявление или выражение....

16
ответ дан 24 November 2019 в 12:06
поделиться

Как правило: тернарный оператор в 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
136
ответ дан 24 November 2019 в 12:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: