サーチ…


備考

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)

条件が真でない場合、 condCondClauseErrorます。

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ブロックの結果です。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow