Мне нравится разумное использование троичного, условного оператора. По моему мнению это довольно сжато.
Однако в рубине, я нахожу, что часто тестирую методы предиката, которые уже имеют их собственные вопросительные знаки:
some_method( x.predicate? ? foo : bar )
Я сотрясаюсь теми двумя вопросительными знаками так друг близко к другу. Существует ли эквивалентно компактная и читаемая альтернатива?
Ближайшее краткое выражение, которое вы можете получить, - это
x.predicate? && foo || bar
, которое действует как тернарный оператор, но более загадочный и уродливый.
Это просто синтаксический диабет, вызванный сахаром в методах запроса ?
. Думаю, нам просто нужно научиться жить с этим.
Причина, по которой условный оператор необходим в 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