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


есть ли идиома ruby для "Если делать-это" и "делать-это" просто как простая команда?

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

object.method ? a.action : nil

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

5 68

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

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

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

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

if object.method; a.action end

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

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

if object.method then a.action end