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

есть ли идиома ruby для "If do-this" и "do-this" просто как простая команда?

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

object.method ? a.action : nil

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

5 ответов


a.action if object.method?

как общее правило: вам почти никогда не нужен тернарный оператор в 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 '# = > возвращает результат последнего выражения, value равно 1 so и раздел будет оценен, и вернет 'one'.

value = 0 result = (value == 1 && 'one' ) || 'two' result #=> 'two'

объясняю: ценность != 1 и " и " выражение не будет оцениваться, но instad будет использоваться "или" выражение, и оно возвращает "два"


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

if object.method; a.action end

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

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

if object.method then a.action end