수색…


보호 조항의 기본 사용법

Elixir에서는 동일한 이름을 가진 함수의 여러 구현을 만들 수 있으며 실행할 구현을 결정하기 위해 함수 를 호출하기 전에 함수의 매개 변수에 적용될 규칙을 지정할 수 있습니다.

이러한 규칙은 when 키워드로 표시되며 def function_name(params) 과 함수 정의에서 do 에 있습니다. 간단한 예 :

defmodule Math do

  def is_even(num) when num === 1 do
    false
  end
  def is_even(num) when num === 2 do
    true
  end

  def is_odd(num) when num === 1 do
    true
  end
  def is_odd(num) when num === 2 do
    false
  end

end

이 예제로 Math.is_even(2) 을 실행한다고 가정 해 보겠습니다. is_even 에는 두 개의 구현이 있는데, 서로 다른 guard 절이있다. 시스템은 이들을 순서대로보고 매개 변수가 guard 절을 만족시키는 첫 번째 구현을 실행합니다. 첫 번째 것은 num === 1 이 사실이 아니므로 다음 단계로 넘어갑니다. 두 번째 것은 num === 2 지정하며, 이는 사용 된 구현이므로 반환 값이 true 됩니다.

Math.is_odd(1) 실행하면 어떻게됩니까? 시스템은 첫 번째 구현을 살펴보고 num1 이므로 첫 번째 구현의 guard 절이 충족됨을 확인합니다. 그러면 해당 구현을 사용하고 true 반환하고 다른 구현을 보지 않아도됩니다.

경비원은 수행 할 수있는 작전 유형이 제한되어 있습니다. Elixir 문서에는 허용되는 모든 작업이 나열되어 있습니다 . 즉, 비교, 수학, 이진 연산, 유형 검사 (예 : is_atom ) 및 소수의 편의 기능 (예 : length )을 허용합니다. 사용자 정의 가드 절을 정의 할 수는 있지만 매크로를 작성해야하며보다 고급 가이드 용으로 남겨 두는 것이 가장 좋습니다.


경비원은 오류를 던지지 않습니다. 그것들은 가드 절의 정상적인 실패로 간주되고 시스템은 다음 구현을 살펴 봅니다. params가있는 보호 된 함수를 호출 할 때 (FunctionClauseError) no function clause matching 하면 작업 할 것으로 예상되는 보호 절이 삼키는 오류가 발생할 수 있습니다.

이것을 직접 확인하려면 다음과 같이 0으로 나누려고하는 것과 같은 의미가없는 가드가있는 함수를 만들고 호출하십시오.

defmodule BadMath do
  def divide(a) when a / 0 === :foo do
    :bar
  end
end

BadMath.divide("anything") 호출하면 다소 도움이되지 않는 오류 (FunctionClauseError) no function clause matching in BadMath.divide/1 반면에 "anything" / 0 직접 실행하려고하면 더 많은 도움이됩니다. 오류 : (ArithmeticError) bad argument in arithmetic expression .



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