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
場合にのみ評価されますと評価されa
true
式
a || b
、部分式b
場合にのみ評価されますと評価されa
false
このように、双方の間、 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
て、両方の分岐を評価します。これは、ブランチが評価されなければならない副作用を有する場合、または両方のブランチ自体が安価である場合に高速化することができるので有用であり得る。