рубиновая идиома: предикаты и условный оператор

Мне нравится разумное использование троичного, условного оператора. По моему мнению это довольно сжато.

Однако в рубине, я нахожу, что часто тестирую методы предиката, которые уже имеют их собственные вопросительные знаки:

some_method( x.predicate? ? foo : bar )

Я сотрясаюсь теми двумя вопросительными знаками так друг близко к другу. Существует ли эквивалентно компактная и читаемая альтернатива?

6
задан pilcrow 12 July 2010 в 18:54
поделиться

2 ответа

Ближайшее краткое выражение, которое вы можете получить, - это

x.predicate? && foo || bar

, которое действует как тернарный оператор, но более загадочный и уродливый.

Это просто синтаксический диабет, вызванный сахаром в методах запроса ? . Думаю, нам просто нужно научиться жить с этим.

9
ответ дан 8 December 2019 в 04:27
поделиться

Причина, по которой условный оператор необходим в C, заключается в том, что условный оператор - это, ну, оператор, т.е. он не возвращает (и не может возвращать) значение. Поэтому, если вы хотите вернуть значение из условного кода, вам не повезло. Вот почему пришлось добавить условный оператор: он является выражением, т.е. возвращает значение.

В Ruby, однако, условный оператор совершенно излишен, потому что в Ruby все равно нет выражений. Все является выражением. В частности, в Ruby не существует if, есть только if выражение.

И поскольку if все равно является выражением, вы можете просто использовать его вместо загадочного условного оператора:

some_method( if x.predicate? then foo else bar end )

Единственное, что вы должны помнить, это то, что предикат должен быть завершен либо новой строкой, либо точкой с запятой, либо then. Таким образом, первые три раза, когда вы это сделаете, вы превратите

if cond
  foo
else
  bar
end

в

if cond foo else bar end

и будете удивляться, почему это не работает. Но после этого then (или точка с запятой) придет сама собой:

if cond; foo else bar end
if cond then foo else bar end
12
ответ дан 8 December 2019 в 04:27
поделиться