Elixir Language
条件式
サーチ…
備考
do...end
構文は、通常のキーワードリストの構文的な砂糖なので、実際にはこれを行うことができます:
unless false, do: IO.puts("Condition is false")
# Outputs "Condition is false"
# With an `else`:
if false, do: IO.puts("Condition is true"), else: IO.puts("Condition is false")
# Outputs "Condition is false"
場合
case {1, 2} do
{3, 4} ->
"This clause won't match."
{1, x} ->
"This clause will match and bind x to 2 in this clause."
_ ->
"This clause would match any value."
end
case
は、特定のデータの指定されたパターンを照合するためにのみ使用されます。ここで、 {1,2}
はコード例で与えられた異なるケースパターンと一致しています。
ifとunless
if true do
"Will be seen since condition is true."
end
if false do
"Won't be seen since condition is false."
else
"Will be seen.
end
unless false do
"Will be seen."
end
unless true do
"Won't be seen."
else
"Will be seen."
end
条件
cond do
0 == 1 -> IO.puts "0 = 1"
2 == 1 + 1 -> IO.puts "1 + 1 = 2"
3 == 1 + 2 -> IO.puts "1 + 2 = 3"
end
# Outputs "1 + 1 = 2" (first condition evaluating to true)
条件が真でない場合、 cond
はCondClauseError
ます。
cond do
1 == 2 -> "Hmmm"
"foo" == "bar" -> "What?"
end
# Error
これは、常に真である条件を追加することで回避できます。
cond do
... other conditions
true -> "Default value"
end
デフォルトのケースに到達することは決して予想されない限り、プログラムは実際にその時点でクラッシュすべきです。
with節
with
句は、一致する句を結合するために使用されます。匿名関数を組み合わせたり、関数を複数の本体(一致する節)と組み合わせるように見えます。この場合を考えてみましょう。ユーザーを作成し、DBに挿入してから、挨拶メールを作成してユーザーに送信します。
with
節がなければ、次のように書くことができます(私は関数の実装を省略しました)。
case create_user(user_params) do
{:ok, user} ->
case Mailer.compose_email(user) do
{:ok, email} ->
Mailer.send_email(email)
{:error, reason} ->
handle_error
end
{:error, changeset} ->
handle_error
end
ここでは、ビジネスプロセスの流れをcase
処理します( cond
またはif
である可能性があります)。それは、私たちが可能な条件に対処し、より多くの移動をするかどうかを決定しなければならないので、いわゆる「運命のピラミッド」につながります。このコードwith
ステートメントで書き直すほうがはるかに良いでしょう。
with {:ok, user} <- create_user(user_params),
{:ok, email} <- Mailer.compose_email(user) do
{:ok, Mailer.send_email}
else
{:error, _reason} ->
handle_error
end
上のコードスニペットでは、ネストされたcase
節をwith
書き直しました。 with
中でwith
いくつかの関数(匿名または名前付き)とその出力上のパターンマッチを呼び出します。すべてがマッチした場合は、 with
リターンdo
ブロックの結果、またはelse
それ以外のブロックの結果を。
私たちは、省略することができelse
ように、 with
いずれかを返しますdo
ブロックの結果をまたは最初の結果を失敗します。
ですから、 with
文の値はdo
ブロックの結果です。