與條款

with 子句用於組合匹配子句。看起來我們將匿名函式或處理函式與多個實體(匹配子句)結合起來。考慮這種情況:我們建立一個使用者,將其插入資料庫,然後建立問候電子郵件,然後將其傳送給使用者。

如果沒有 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 處理我們的業務流程(可能是 condif)。這導致我們所謂的 厄運金字塔 ,因為我們必須處理可能的條件並決定:是否進一步行動。使用 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

在上面的程式碼片段中,我們用 with 重寫了巢狀的 case 子句。在 with 中,我們呼叫一些函式(匿名或命名)和輸出上的模式匹配。如果全部匹配,則 with 返回 do 塊結果,否則為 else 塊結果。

我們可以省略 else,因此 with 將返回 do 塊結果或第一個失敗結果。

所以,with 語句的值是它的 do 塊結果。