Elixir Language
Conditionals
Поиск…
замечания
Обратите внимание, что синтаксис 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
блока.