Ответ 1
a.action if object.method?
Есть ли рубиновая идиома для "If do-this" и "do-this" как простая команда?
например, я сейчас делаю
object.method ? a.action : nil
чтобы оставить условие else пустым, но я чувствую, что, вероятно, есть более идиоматический способ сделать это, что не связано с необходимостью указать нуль в конце. (и, альтернативно, я чувствую, что захват нескольких строк кода будет бесполезным в этом случае.
a.action if object.method?
Как правило, вы почти никогда не нуждаетесь в тройном операторе в 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 Кэмпбелл, в свою очередь эквивалентен предыдущей форме модификатора if
a.action if object.method
Кроме того, поскольку логические операторы в Ruby не просто возвращают true
или false
, но и значение последнего оцененного выражения, вы можете использовать их для потока управления. Это идиома, импортированная из Perl, и будет выглядеть так:
object.method and a.action
Ответ Greg - лучший, но для записи и даже больше, чем в 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, поэтому и раздел будет оцениваться, а return 'one'.
value = 0
result = (value == 1 && 'one' ) || 'two'
result #=> 'two'
Объясните: значение!= 1 и выражение "и" не будет оцениваться, но instad будет использоваться выражение "или", и он возвращает "два"
Другим способом это можно сделать в одной строке:
if object.method; a.action end
Это считается плохим стилем Rubocop, потому что он использует точку с запятой, чтобы прервать выражение, но в некоторых случаях я считаю его более читаемым, чем приведение в конец инструкции if в конце. Легче упустить утверждение if в конце, и я не всегда хочу что-то возвращать, если условие не соответствует действительности (так как вы вынуждены вставлять тернарный оператор).
Вы также можете быть немного более подробным и дружелюбивым:
if object.method then a.action end