수색…


비고

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} 는 코드 예제에서 제공된 다른 사례 패턴과 일치합니다.

만약 그렇다면

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)

조건이 true가 CondClauseError 경우 condCondClauseError 발생 CondClauseError .

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

항상 사실 인 조건을 추가하면이 문제를 피할 수 있습니다.

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

기본 사례에 도달 할 것으로 예상되는 경우가 아니면 프로그램이 사실 그 시점에서 충돌해야합니다.

with 절

with 절은 일치하는 절을 결합하는 데 사용됩니다. 익명의 함수를 조합하거나 함수를 여러 본문 (일치하는 절)으로 처리하는 것처럼 보입니다. 이 경우를 생각해보십시오 : 사용자를 생성하여 DB에 삽입 한 다음 인사말 전자 메일을 작성한 다음 사용자에게 보냅니다.

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 가지고 비즈니스 프로세스의 흐름을 case ( cond 또는 if 일 수 있음). 그로 인해 우리는 소위 '운명의 피라미드 (pyramid of doom)'로이 끕니다. 왜냐하면 우리는 가능한 조건을 다루고 결정해야하기 때문입니다. 이 코드 with statement로 다시 작성하는 것이 훨씬 더 좋을 것입니다 :

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 . with 일부 함수 (익명 또는 명명 된 함수)를 호출하고 출력에서 ​​패턴 일치를 호출합니다. 모두가 일치하는 경우 with 반환 do 블록의 결과, 또는 else 다른 블록 결과입니다.

우리는 생략 할 수 있습니다 else , 그래서 with 반환하거나됩니다 do 블록의 결과 또는 첫 번째 실패 결과입니다.

따라서 with 문의 값은 do 블록 결과입니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow