Sök…


Anmärkningar

Observera att syntaxen do...end är syntaktiskt socker för vanliga nyckelordslistor, så du kan faktiskt göra detta:

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"

fall

 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 används endast för att matcha det givna mönstret för den specifika datan. Här är {1,2} matchande med olika fallmönster som ges i kodexemplet.

om och om inte

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

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 höjer en CondClauseError om inga villkor är sanna.

cond do
  1 == 2 -> "Hmmm"
  "foo" == "bar" -> "What?"
end
# Error

Detta kan undvikas genom att lägga till ett villkor som alltid kommer att vara sant.

cond do
  ... other conditions
  true -> "Default value"
end

Såvida det aldrig förväntas nå standardfallet, och programmet bör faktiskt krascha vid den punkten.

med klausul

with klausul används för att kombinera matchande klausuler. Det ser ut som att vi kombinerar anonyma funktioner eller hanterar funktion med flera organ (matchande klausuler). Tänk på fallet: vi skapar en användare, sätter in den i DB, skapar sedan hälsningsmeddelande och skickar sedan till användaren.

Utan with klausulen kan vi skriva något liknande (jag utelämnade funktioner implementationer):

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

Här hanterar vi vår affärsprocesss flöde med case (det kan vara cond eller if ). Det leder oss till den så kallade "undergångspyramiden" , eftersom vi måste ta itu med möjliga förhållanden och besluta: huruvida vi ska gå vidare eller inte. Det skulle vara mycket trevligare att skriva om denna kod med with uttalande:

with {:ok, user} <- create_user(user_params),
     {:ok, email} <- Mailer.compose_email(user) do
  {:ok, Mailer.send_email}
else
  {:error, _reason} ->
    handle_error
end

I koden utdrag ovan vi har omskrivnings kapslade case klausuler med with . Inom with åberopar vi vissa funktioner (antingen anonyma eller namngivna) och mönster matchar på deras utgångar. Om allt matchas with retur do blockera resultat eller else blockera resultatet annars.

Vi kan utelämna elsewith kommer att återvända antingen do blockera resultat eller den första misslyckas resultatet.

Så är värdet av with uttalande dess do block-resultat.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow