@ pst дал отличный ответ, но я хотел бы отметить, что в Ruby троичный оператор записан в одну строку, чтобы быть синтаксически правильным, в отличие от Perl и C, где мы можем записать его в несколько строк:
(true) ? 1 : 0
Обычно Ruby выдает ошибку, если вы пытаетесь разбить ее на несколько строк, но вы можете использовать символ продолжения строки \
в конце строки, и Ruby будет счастлив:
(true) \
? 1 \
: 0
Это простой пример, но он может быть очень полезен при работе с более длинными строками, так как он хорошо сохраняет код.
Также возможно использовать троичный без символов продолжения строки с помощьюставить операторы в последнюю очередь, но я не люблю или не рекомендую это:
(true) ?
1 :
0
Я думаю, что это приводит к действительно трудному чтению кода, поскольку условный тест и / или результаты становятся длиннее.
Я читал комментарии о том, что не следует использовать троичный оператор, потому что это сбивает с толку, но это плохая причина не использовать что-то.По той же логике мы не должны использовать регулярные выражения, операторы диапазона ('..
' и, казалось бы, неизвестный вариант "триггера").Они эффективны при правильном использовании, поэтому мы должны научиться правильно их использовать.
Почему вы поставили скобки вокруг true
?
РассмотримПример OP:
<% question = question.size > 20 ? question.question.slice(0, 20)+"..." : question.question %>
Упаковка условного теста помогает сделать его более читабельным, поскольку он визуально разделяет тест:
<% question = (question.size > 20) ? question.question.slice(0, 20)+"..." : question.question %>
Конечно, весь пример можно сделать намного более читабельнымиспользуя некоторые разумные дополнения пробелов.Это не проверено, но вы поймете, что идея:
<% question = (question.size > 20) ? question.question.slice(0, 20) + "..." \
: question.question
%>
Или, более подробно написано более идиоматически:
<% question = if (question.size > 20)
question.question.slice(0, 20) + "..."
else
question.question
end
%>
Было бы легко утверждать, что читаемость сильно страдает от question.question
тоже.