Подтвердить что ты не робот

Рубиновый тернарный оператор без прочего

Есть ли рубиновая идиома для "If do-this" и "do-this" как простая команда?

например, я сейчас делаю

object.method ? a.action : nil

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

4b9b3361

Ответ 1

a.action if object.method?

Ответ 2

Как правило, вы почти никогда не нуждаетесь в тройном операторе в 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

Ответ 3

Ответ 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 нет ситуации, когда допускается только один оператор или выражение...

Ответ 4

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 будет использоваться выражение "или", и он возвращает "два"

Ответ 5

Другим способом это можно сделать в одной строке:

if object.method; a.action end

Это считается плохим стилем Rubocop, потому что он использует точку с запятой, чтобы прервать выражение, но в некоторых случаях я считаю его более читаемым, чем приведение в конец инструкции if в конце. Легче упустить утверждение if в конце, и я не всегда хочу что-то возвращать, если условие не соответствует действительности (так как вы вынуждены вставлять тернарный оператор).

Вы также можете быть немного более подробным и дружелюбивым:

if object.method then a.action end