Как условный оператор ( ? :
) используется в Ruby?
Например, это правильно?
<% question = question.size > 20 ? question.question.slice(0, 20)+"..." : question.question %>
ruby
ternary-operator
conditional-operator
Митхун Шридхаран
источник
источник
question=question[0,20]
если он был меньше 20, это ничего не изменит.Ответы:
Это троичный оператор , и он работает как в C (круглые скобки не требуются). Это выражение работает так:
Однако в Ruby
if
также есть выражение:if a then b else c end
===a ? b : c
, за исключением проблем с приоритетами. Оба выражения.Примеры:
Обратите внимание, что в первом случае требуются круглые скобки (в противном случае Ruby путается, потому что думает, что это
puts if 1
с каким-то дополнительным мусором после него), но они не требуются в последнем случае, так как упомянутая проблема не возникает.Вы можете использовать форму long-if для удобства чтения на нескольких строках:
источник
nil
иfalse
. Не очень обычно, действительно.источник
puts (true ? "true" : "false")
с круглыми скобками. В противном случае порядок операций неясен. Когда я впервые прочитал это, я был сбит с толку, поскольку я читал это, как(puts true) ? "true" : "false"
тогда ожидалось,puts
чтобы вернуть логическое значение, которое затем стало строковым значением.Ваше использование ERB предполагает, что вы находитесь в Rails. Если это так, то подумайте
truncate
, встроенный помощник, который сделает эту работу за вас:источник
@pst дал отличный ответ, но я хотел бы отметить, что в Ruby троичный оператор записан в одну строку, чтобы быть синтаксически правильным, в отличие от Perl и C, где мы можем написать его в несколько строк:
Обычно Ruby вызывает ошибку, если вы пытаетесь разбить ее на несколько строк, но вы можете использовать
\
символ продолжения строки в конце строки, и Ruby будет счастлив:Это простой пример, но он может быть очень полезен при работе с более длинными строками, так как он хорошо выкладывает код.
Также возможно использовать троичный без символов продолжения строки, помещая операторы последними в строке, но я не люблю или не рекомендую это:
Я думаю, что это приводит к тому, что код становится действительно трудно читать, поскольку условный тест и / или результаты становятся длиннее.
Я читал комментарии о том, что нельзя использовать троичный оператор, потому что это сбивает с толку, но это плохая причина не использовать что-то. По той же логике мы не должны использовать регулярные выражения, операторы диапазона ('
..
' и, казалось бы, неизвестный вариант "триггера"). Они эффективны при правильном использовании, поэтому мы должны научиться правильно их использовать.Рассмотрим пример ОП:
Упаковка условного теста помогает сделать его более читабельным, поскольку он визуально разделяет тест:
Конечно, весь пример можно сделать намного более читабельным, если использовать некоторые разумные добавления пробелов. Это не проверено, но вы получите идею:
Или, более написано более идиоматически:
Было бы легко утверждать, что читаемость
question.question
тоже сильно страдает .источник
true
?true
что на самом деле сидит за то, что будет выражением, которое оцениваетtrue
илиfalse
. Лучше визуально разграничить их, поскольку троичные операторы могут быстро перерасти в визуальный шум, снижая читабельность, что влияет на удобство обслуживания.Простой пример, где оператор проверяет, равен ли идентификатор игрока 1, и устанавливает идентификатор врага в зависимости от результата.
И я нашел пост на тему, который кажется довольно полезным.
источник
enemy_id = player_id == 1 ? 2 : 1
?Код
condition ? statement_A : statement_B
эквивалентенисточник
Самый простой способ:
так
param_a
как не равно,param_b
тоresult
значение будетNot same!
источник