Есть ли у Юлии троичный условный оператор?
Python, Java и Scala имеют троичные операторы. Какой эквивалент у Юлии?
2 ответа
Для встроенного использования, а? b: c существует, как упоминалось в предыдущем ответе. Однако стоит отметить, что if-else-end в Julia работает так же, как (если cond expr1 expr2) на большинстве диалектов Лисп, который действует как выражение if и как троичный оператор. Таким образом, if-then-else возвращает возвращаемое значение выражения, которое выполняется.
Это означает, что вы можете писать такие вещи, как
function abs(x)
if x > 0
x
else
-x
end
end
и это вернет то, что вы хотите. Вам не нужно использовать оператор return для разрыва функционального блока, вы просто возвращаете значение, возвращаемое блоком if.
Встроенный, вы можете написать
if (x > 0) x else -x end
который вернет то же самое, что и выражение троичного оператора (x > 0)? x: -x, но имеет преимущество в том, что избегает символов perl-ish?: и обычно более читабелен.
Большинство языков имеют тернарный оператор, отдельный от if-then-else, потому что, если предложения являются операторами, тогда как в языках, подобных lisp, они являются выражениями, как и все остальное, и имеют возвращаемое значение.
Вы ссылаетесь на это?
a = true
b = 1
c = 2
julia>a ? b : c
1
a = false
julia>a ? b : c
2
Да! У Джулии есть тернарный оператор. Вот краткий пример из документации Julia docs Julia:
Так называемый "тернарный оператор", ?:
, тесно связан с синтаксисом if-elseif-else, но используется там, где требуется условный выбор между значениями одного выражения, в отличие от условного выполнения более длинных блоков кода. Он получил свое название от того, что является единственным оператором на большинстве языков, принимающим три операнда:
a ? b : c
Выражение a
, перед ?
, является выражением условия, а тернарная операция вычисляет выражение b перед:, если условие a истинно или выражение c
, после :
, если это ложь. Обратите внимание, что пробелы вокруг?
а также :
обязательны: выражение вроде a?b:c
не является допустимым тернарным выражением (но допустима новая строка после обоих ?
и :
).
Самый простой способ понять это поведение - посмотреть на примере. В предыдущем примере вызов println используется всеми тремя ветвями: единственный реальный выбор - это буквальная строка для печати. Это можно было бы записать более кратко, используя тернарный оператор. Для ясности давайте сначала попробуем двустороннюю версию:
julia> x = 1; y = 2;
julia> println(x < y ? "less than" : "not less than")
less than
julia> x = 1; y = 0;
julia> println(x < y ? "less than" : "not less than")
not less than