Szukaj…


Składnia

  • jeśli cond; ciało; koniec
  • jeśli cond; ciało; jeszcze; ciało; koniec
  • jeśli cond; ciało; else if cond; ciało; jeszcze; koniec
  • jeśli cond; ciało; else if cond; ciało; koniec
  • Cond? iftrue: iffalse
  • cond && iftrue
  • war || iffalse
  • ifelse (cond, iftrue, iffalse)

Uwagi

Wszystkie operatory warunkowe i funkcje wymagają użycia warunków logicznych ( true lub false ). W Julii typem booleanów jest Bool . W przeciwieństwie do niektórych innych języków, innych rodzajów liczb (takich jak 1 lub 0 ), ciągów, tablic itp. Nie można używać bezpośrednio w warunkowych.

Zazwyczaj używa się funkcji predykatu (funkcje zwracające wartość Bool ) lub operatorów porównania w warunkach operatora warunkowego lub funkcji.

jeśli ... jeszcze wyrażenie

Najczęstszym warunkiem w Julii jest wyrażenie if ... else . Na przykład poniżej implementujemy algorytm euklidesowy do obliczania największego wspólnego dzielnika , wykorzystując warunek do obsługi przypadku podstawowego:

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

Forma if ... else w Julii jest w rzeczywistości wyrażeniem i ma wartość; wartość jest wyrażeniem w pozycji ogona (to jest ostatnim wyrażeniem) na branej gałęzi. Rozważ następujące przykładowe dane wejściowe:

julia> mygcd(0, -10)
10

Tutaj a wynosi 0 a b oznacza -10 . Warunek a == 0 jest true , więc brana jest pierwsza gałąź. Zwrócona wartość to abs(b) która wynosi 10 .

julia> mygcd(2, 3)
1

Tutaj a oznacza 2 a b oznacza 3 . Warunek a == 0 jest fałszem, więc brana jest druga gałąź i obliczamy mygcd(b % a, a) , czyli mygcd(3 % 2, 2) . Operator % zwraca resztę, gdy 3 jest dzielone przez 2 , w tym przypadku 1 . W ten sposób obliczamy mygcd(1, 2) , a tym razem a wynosi 1 a b wynosi 2 . Ponownie a == 0 jest fałszem, więc brana jest druga gałąź i obliczamy mygcd(b % a, a) , czyli mygcd(0, 1) . Tym razem a == 0 a więc zwracany jest abs(b) , co daje wynik 1 .

jeśli ... oświadczenie else

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

Każde wyrażenie, takie jak wyrażenie if ... else , można ustawić w pozycji instrukcji. To ignoruje jego wartość, ale nadal wykonuje wyrażenie dla skutków ubocznych.

instrukcja if

Jak każde inne wyrażenie, wartość zwracaną wyrażenia if ... else można zignorować (a tym samym odrzucić). Jest to na ogół przydatne tylko wtedy, gdy treść wyrażenia ma skutki uboczne, takie jak zapis do pliku, mutowanie zmiennych lub drukowanie na ekranie.

Ponadto, else oddział if ... else wyrazu jest opcjonalne. Na przykład możemy napisać następujący kod, aby wyświetlić go na ekranie tylko wtedy, gdy spełniony jest określony warunek:

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

W powyższym przykładzie używamy funkcji godziny i daty, aby uzyskać bieżącą sekundę; na przykład, jeśli aktualnie jest 10:55:27, zmienna second będzie zawierać 27 . Jeśli ta liczba jest parzysta, linia zostanie wydrukowana na ekranie. W przeciwnym razie nic nie zostanie zrobione.

Trójskładnikowy operator warunkowy

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

Trójskładnikowy operator warunkowy jest mniej skomplikowanym wyrażeniem, if ... else .

Składnia jest w szczególności:

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

W tym przykładzie dodajemy x do kolekcji A tylko wtedy, gdy x nie jest już w A W przeciwnym razie pozostawiamy A bez zmian.

Referencje operatora trójskładnikowego:

Operatorzy zwarciowi: && i ||

Do rozgałęzienia

Zwarciowe operatory warunkowe && i || może być stosowany jako lekki zamiennik dla następujących konstrukcji:

  • x && y jest równoważne x ? y : x
  • x || y jest równoważne x ? x : y

Jednym z zastosowań dla operatorów zwarciowych jest bardziej zwięzły sposób przetestowania stanu i wykonania określonej czynności w zależności od tego stanu. Na przykład poniższy kod używa operatora && do zgłaszania błędu, jeśli argument x jest ujemny:

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

|| operator może być również używany do sprawdzania błędów, z wyjątkiem tego, że wyzwala błąd, chyba że warunek się utrzymuje, zamiast tego, jeśli warunek się utrzymuje:

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

Innym przydatnym zastosowaniem tego jest dostarczenie wartości domyślnej do obiektu, tylko jeśli nie jest on wcześniej zdefiniowany:

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

Tutaj sprawdza się, czy zdefiniowano symbol x (tj. Czy do obiektu x przypisana jest wartość). Jeśli tak, to nic się nie dzieje. Ale jeśli nie, to x zostanie przypisane NEW_VALUE . Pamiętaj, że ten przykład będzie działał tylko w zakresie najwyższego poziomu.

W warunkach

Operatory są również przydatne, ponieważ można ich użyć do przetestowania dwóch warunków, z których drugi jest oceniany tylko w zależności od wyniku pierwszego warunku. Z dokumentacji Julii:

W wyrażeniu a && b podwyrażenie b jest oceniane tylko wtedy, a wartość a jest true

W wyrażeniu a || b , podwyrażenie b jest oceniane tylko wtedy, gdy a jest a false

Tak więc, podczas gdy zarówno a & b i a && b dają true jeśli oba a i btrue , ich zachowanie, jeśli a jest false jest inne.

Załóżmy na przykład, że chcemy sprawdzić, czy obiekt jest liczbą dodatnią, w przypadku gdy możliwe, że nie jest to nawet liczba. Rozważ różnice między tymi dwiema próbami implementacji:

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

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

CheckPositive1() zwróci błąd, jeśli CheckPositive1() zostanie CheckPositive1() jako argument. Wynika to z tego, że ocenia oba wyrażenia, niezależnie od wyniku pierwszego, a drugie wyrażenie spowoduje błąd, gdy ktoś spróbuje go ocenić dla typu nienumerycznego.

CheckPositive2() da jednak wartość false (zamiast błędu), jeśli zostanie do niej CheckPositive2() typ nienumeryczny, ponieważ drugie wyrażenie jest oceniane tylko wtedy, gdy pierwsze jest true .

Można połączyć razem więcej niż jednego operatora zwarciowego. Na przykład:

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

instrukcja if z wieloma gałęziami

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

Dowolna liczba gałęzi elseif może być używana z instrukcją if , ewentualnie z końcową gałęzią else lub bez niej. Kolejne warunki zostaną ocenione tylko wtedy, gdy wszystkie wcześniejsze warunki zostaną uznane za false .

Funkcja ifelse

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

Stosowanie:

julia> shift(10)
9

julia> shift(11)
12

julia> shift(-1)
-2

Funkcja ifelse oceni obie gałęzie, nawet tę, która nie została wybrana. Może to być przydatne, gdy oddziały mają skutki uboczne, które należy ocenić, lub ponieważ może być szybsze, jeśli obie gałęzie są tanie.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow