Есть ли у Юлии троичный условный оператор?

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
Другие вопросы по тегам