Julia Language
条件式
サーチ…
構文
- if cond;体;終わり
- if cond;体; else;体;終わり
- if cond;体; elseif cond;体; else;終わり
- if cond;体; elseif cond;体;終わり
- 条件? iftrue:iffalse
- cond && iftrue
- cond || iffalse
- ifelse(cond、iftrue、iffalse)
備考
すべての条件演算子と関数にはブール条件( trueまたはfalse )を使用する必要があります。ジュリアでは、ブール値の型があるBool 。他の言語とは異なり、他の種類の数値( 1や0 )、文字列、配列などは条件文で直接使用することはできません 。
通常、条件演算子または関数の条件で述語関数( Boolを返す関数)または比較演算子のいずれかを使用します。
if ... else式
Juliaの最も一般的な条件はif ... else式です。たとえば、基本ケースを処理する条件を使用して、 最大公約数を計算するためのユークリッドアルゴリズムを実装します。
mygcd(a, b) = if a == 0
abs(b)
else
mygcd(b % a, a)
end
Juliaのif ... elseフォームは実際には式であり、値を持ちます。値は、実行されたブランチ上の末尾の式(つまり、最後の式)です。次のサンプル入力を考えてみましょう。
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は偽であるため、2番目の分岐をとり、 mygcd(3 % 2, 2) mygcd(b % a, a)であるmygcd(b % a, a)を計算します。 %演算子は、 3を2で除算したときの剰余を返します。この場合1です。したがって、私たちはmygcd(1, 2)を計算し、今回はaが1 、 bが2です。もう一度、 a == 0が偽であるので、2番目の枝をとり、 mygcd(b % a, a)を計算します。これはmygcd(0, 1)です。今回はa == 0 、 abs(b)が返され、結果は1ます。
if ... elseステートメント
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ステートメント
他の式と同様に、 if ... else式の戻り値は無視できます(したがって廃棄されます)。これは一般に、式の本体にファイルへの書き込み、変数の変更、画面への印刷などの副作用がある場合にのみ有効です。
さらに、 if ... else式のelseブランチはオプションです。たとえば、特定の条件が満たされた場合にのみ、次のコードを出力して画面に出力することができます。
second = Dates.second(now())
if iseven(second)
println("The current second, $second, is even.")
end
上記の例では、現在の秒を取得するためにtimeとdate関数を使用しています。たとえば、現在10:55:27の場合、変数secondは27を保持します。この番号が偶数の場合は、画面に行が印刷されます。それ以外の場合は、何も行われません。
三項条件演算子
pushunique!(A, x) = x in A ? A : push!(A, x)
三項条件演算子は、 if ... else式else少ない単語if 。
具体的な構文は次のとおりです。
[condition] ? [execute if true] : [execute if false]
この例では、追加xコレクションにA場合にのみ、 xになっていないA 。それ以外の場合は、 A変更しないでください。
三項演算子参考文献:
短絡演算子:&&および||
分岐用
短絡条件演算子&&と||次の構造体の軽量置換として使用できます。
-
x && yはx && yと等価x ? y : x -
x || yはx ? x : yと等価x ? x : y
短絡オペレータの1つの用途は、条件をテストし、その条件に応じて特定のアクションを実行する、より簡潔な方法です。たとえば、次のコードでは、引数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
これのもう1つの有用なアプリケーションは、以前に定義されていない場合に限り、オブジェクトにデフォルト値を提供することです。
isdefined(:x) || (x = NEW_VALUE)
ここでは、シンボルxが定義されているかどうかをチェックします(つまり、オブジェクトx割り当てられている値がある場合)。もしそうなら、何も起こらない。しかし、そうでなければ、 xはNEW_VALUEに割り当てられます。この例は、トップレベルのスコープでのみ機能することに注意してください。
条件
演算子は2つの条件をテストするために使用することができ、2つ目の条件は最初の条件の結果のみに基づいて評価されるため、演算子も便利です。ジュリアの文書から:
式では
a && b、部分式b場合にのみ評価されますと評価されatrue式
a || b、部分式b場合にのみ評価されますと評価されafalse
このように、双方の間、 a & bとa && b得られますtrueの両方の場合はaとbありtrue場合、彼らの行動であるa false異なっています。
たとえば、オブジェクトが正の数であるかどうかを確認したいとします。ここで、数でなくても可能性があります。試みられたこれらの2つの実装の違いを考えてみましょう。
CheckPositive1(x) = (typeof(x)<:Number) & (x > 0) ? true : false
CheckPositive2(x) = (typeof(x)<:Number) && (x > 0) ? true : false
CheckPositive1("a")
CheckPositive2("a")
CheckPositive1()は、数値以外の型が引数としてCheckPositive1()場合にエラーを生成します。これは、最初の式の結果に関係なく両方の式を評価するためで、2番目の式は数値以外の型の評価を試みるとエラーになります。
CheckPositive2()但し、生じるであろうfalse非数値タイプは、それに供給される場合は、最初である場合、第二の発現のみが評価されるので、(むしろ誤差より) true 。
2つ以上の短絡オペレータを一緒に張ることができます。例えば:
1 > 0 && 2 > 0 && 3 > 5
複数の分岐を持つif文
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
場合によっては最後のelseブランチの有無にかかわらず、任意の数のelseifブランチをifステートメントとともに使用することができます。後続の条件は、すべての前の条件がfalseことが判明した場合にのみ評価されfalse 。
ifelse関数
shift(x) = ifelse(x > 10, x + 1, x - 1)
使用法:
julia> shift(10)
9
julia> shift(11)
12
julia> shift(-1)
-2
ifelse関数は、選択されていない分岐もifelseて、両方の分岐を評価します。これは、ブランチが評価されなければならない副作用を有する場合、または両方のブランチ自体が安価である場合に高速化することができるので有用であり得る。