Поиск…


замечания

Обратите внимание, что синтаксис 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} сопоставляется с другим шаблоном case, который приведен в примере кода.

если и если

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 пунктом мы могли бы написать что - то вроде этого (я опущена функции реализации):

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 возвратом do результат блока или else блокируйте результат в противном случае.

Мы можем опустить else так with будет возвращать либо do блок результат или первый сбой результат.

Таким образом, значение оператора with - do результат do блока.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow