與條款
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
處理我們的業務流程(可能是 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
在上面的程式碼片段中,我們用 with
重寫了巢狀的 case
子句。在 with
中,我們呼叫一些函式(匿名或命名)和輸出上的模式匹配。如果全部匹配,則 with
返回 do
塊結果,否則為 else
塊結果。
我們可以省略 else
,因此 with
將返回 do
塊結果或第一個失敗結果。
所以,with
語句的值是它的 do
塊結果。