Поиск…


Синтаксис

  • если cond; тело; конец
  • если cond; тело; еще; тело; конец
  • если cond; тело; elseif cond; тело; еще; конец
  • если cond; тело; elseif cond; тело; конец
  • cond? iftrue: iffalse
  • cond && iftrue
  • cond || iffalse
  • ifelse (cond, iftrue, iffalse)

замечания

Все условные операторы и функции включают в себя использование булевых условий ( true или false ). В Julia тип булевых элементов - Bool . В отличие от некоторых других языков, другие типы чисел (например, 1 или 0 ), строки, массивы и т. Д. Не могут использоваться непосредственно в условных выражениях.

Как правило, используются предикатные функции (функции, возвращающие Bool ) или операторы сравнения в условии условного оператора или функции.

if ... else выражение

Наиболее распространенным условным в Юлии является выражение if ... else . Например, ниже мы реализуем евклидовой алгоритм вычисления наибольшего общего делителя , используя условное выражение для обработки базового случая:

mygcd(a, b) = if a == 0
    abs(b)
else
    mygcd(b % a, a)
end

Форма if ... else в Julia на самом деле является выражением и имеет значение; значение представляет собой выражение в позиции хвоста (то есть последнее выражение) на ветке, которая берется. Рассмотрим следующий пример ввода:

julia> mygcd(0, -10)
10

Здесь a равно 0 а b равно -10 . Условие a == 0 true , поэтому берется первая ветвь. Возвращаемое значение - abs(b) которое равно 10 .

julia> mygcd(2, 3)
1

Здесь a равно 2 и b равно 3 . Условие a == 0 ложно, поэтому берется вторая ветвь, и мы вычисляем mygcd(b % a, a) , который является mygcd(3 % 2, 2) . Оператор % возвращает остаток, когда 3 делится на 2 , в этом случае 1 . Таким образом, мы вычисляем mygcd(1, 2) , и на этот раз a равно 1 и b равно 2 . Еще раз, a == 0 является ложным, поэтому берется вторая ветвь, и мы вычисляем mygcd(b % a, a) , который является mygcd(0, 1) . На этот раз возвращается a == 0 и так возвращается abs(b) , что дает результат 1 .

if ... else statement

name = readline()
if startswith(name, "A")
    println("Your name begins with A.")
else
    println("Your name does not begin with A.")
end

Любое выражение, такое как выражение if ... else , может быть помещено в позицию оператора. Это игнорирует его значение, но все же выполняет выражение для его побочных эффектов.

если утверждение

Как и любое другое выражение, возвращаемое значение выражения if ... else можно игнорировать (и, следовательно, отбрасывать). Это обычно полезно только тогда, когда тело выражения имеет побочные эффекты, такие как запись в файл, изменение переменных или печать на экране.

Кроме того, else филиал в if ... else выражение не является обязательным. Например, мы можем написать следующий код для вывода на экран только в том случае, если выполнено конкретное условие:

second = Dates.second(now())
if iseven(second)
    println("The current second, $second, is even.")
end

В приведенном выше примере мы используем функции времени и даты, чтобы получить текущую секунду; например, если в настоящее время 10:55:27, переменная second будет удерживать 27 . Если это число четное, тогда строка будет напечатана на экране. В противном случае ничего не будет сделано.

Тернарный условный оператор

pushunique!(A, x) = x in A ? A : push!(A, x)

Тернарный условный оператор является менее многословным, if ... else выражение.

Синтаксис:

[condition] ? [execute if true] : [execute if false]

В этом примере мы добавляем x в коллекцию A только если x уже не находится в A В противном случае мы оставим A без изменений.

Тернарный оператор Ссылки:

Операторы короткого замыкания: && и ||

Для ветвления

Короткозамкнутые условные операторы && и || могут использоваться как легкие замены для следующих конструкций:

  • x && y эквивалентно x ? y : x
  • x || y эквивалентно x ? x : y

Одно использование для операторов короткого замыкания - это более сжатый способ проверить состояние и выполнить определенное действие в зависимости от этого условия. Например, следующий код использует оператор && для выдачи ошибки, если аргумент x отрицателен:

function mysqrt(x)
    x < 0 && throw(DomainError("x is negative"))
    x ^ 0.5
end

|| оператор также может использоваться для проверки ошибок, за исключением того, что он вызывает ошибку, если условие не выполняется, а не если условие выполнено:

function halve(x::Integer)
    iseven(x) || throw(DomainError("cannot halve an odd number"))
    x ÷ 2
end

Другим полезным приложением является предоставление значения по умолчанию для объекта, только если оно не определено ранее:

isdefined(:x) || (x = NEW_VALUE)

Здесь это проверяет, определен ли символ x (т.е. если есть значение, назначенное объекту x ). Если так, то ничего не происходит. Но, если нет, то x будет назначен NEW_VALUE . Обратите внимание, что этот пример будет работать только в области охвата.

В условиях

Операторы также полезны, поскольку их можно использовать для проверки двух условий, вторая из которых оценивается только в зависимости от результата первого условия. Из документации Julia:

В выражении a && b подвыражение b оценивается только в том случае, если a оценивает значение true

В выражении a || b , Подвыражение b вычисляется только тогда , когда принимает значение a false

Таким образом, хотя оба a & b и a && b будут выдавать true если оба a и b true , их поведение, если a false , отличается.

Например, предположим, что мы хотим проверить, является ли объект положительным числом, где возможно, что он может даже не быть числом. Рассмотрим различия между этими двумя попытками:

CheckPositive1(x) = (typeof(x)<:Number) & (x > 0) ? true : false
CheckPositive2(x) = (typeof(x)<:Number) && (x > 0) ? true : false

CheckPositive1("a")
CheckPositive2("a")

CheckPositive1() приведет к ошибке, если в качестве аргумента будет предоставлен нечисловой тип. Это связано с тем, что он оценивает оба выражения независимо от результата первого, а второе выражение дает ошибку при попытке оценить его для нечислового типа.

CheckPositive2() , однако, даст false (а не ошибку), если к нему будет добавлен нечисловой тип, поскольку второе выражение оценивается только в том случае, если первое true .

Более одного оператора короткого замыкания можно натянуть вместе. Например:

1 > 0 && 2 > 0 && 3 > 5

если оператор с несколькими ветвями

d = Dates.dayofweek(now())
if d == 7
    println("It is Sunday!")
elseif d == 6
    println("It is Saturday!")
elseif d == 5
    println("Almost the weekend!")
else
    println("Not the weekend yet...")
end

Любое число ветвей elseif может использоваться с оператором if , возможно с или без последней ветви else . Последующие условия будут оцениваться только в том случае, если все предыдущие условия оказались false .

Функция ifelse

shift(x) = ifelse(x > 10, x + 1, x - 1)

Использование:

julia> shift(10)
9

julia> shift(11)
12

julia> shift(-1)
-2

Функция ifelse будет оценивать обе ветви, даже те, которые не выбраны. Это может быть полезно, когда ветви имеют побочные эффекты, которые необходимо оценить, или потому, что они могут быть быстрее, если обе ветви сами по себе дешевы.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow