2013-01-19 3 views
2

안녕하세요 저는 Fred Hebert가 Erlang을 통해 Erlang을 배우고 있습니다.매개 변수 번호가있는 Erlang 함수

그리고 나는 혼동에 대한이야 코드 건너했습니다

sword(1) -> throw(slice); 
sword(2) -> erlang:error(cut_arm); 
sword(3) -> exit(cut_leg); 
sword(4) -> throw(punch); 
sword(5) -> exit(cross_bridge). 

talk() -> "blah blah". 

black_knight(Attack) when is_function(Attack, 0) -> 
    try Attack() of 
     _ -> "None shall pass." 
    catch 
     throw:slice -> "It is but a scratch."; 
     error:cut_arm -> "I've had worse."; 
     exit:cut_leg -> "Come on you pansy!"; 
     _:_ -> "Just a flesh wound." 
    end. 

그래서 여기 혼란입니다. 나는 sword(#) 기능을 이해하지 못한다. 매개 변수로 숫자가있는 이유는 무엇입니까? 이 함수는 인수에 대응 0이고 명백하게 모든 sword(#) 기능은 talk 기능 비교 다른 인 black_knight 함수에 sword(#) 함수에 전달하는 인수에 대응 0 또한

방식 인 경우이 함수 is_function 실제로 확인.

책이 sword 기능과 talk 기능을 전달하는 방법은 다음과 같습니다.

exceptions:black_knight(fun exceptions:talk/0). 

exceptions:black_knight(fun() -> exceptions:sword(1) end). 

talk 기능을 대 우리는 단지 sword(1) 함수로 우리는 익명 함수로 포장해야하는 기능을 전달합니다. 나는 그것을 얻지 않는다.

그래서 질문은 왜이 sword(#) 다른 talk에서 기능을 전달하고

  1. .
  2. sword(#)에 숫자를 매개 변수로 사용합니까?
  3. sword(#)에는 1의 값을 가진 것처럼 보이는가? (숫자 매개 변수가 매개 변수로 계산됩니다)? The chapter of the book I'm at.

는 시간 내 주셔서 감사합니다. 당신이 black_knight 기능, is_function(Attack, 0)의 가드 문을 보면 전달 함수가 0 매개 변수를 사용하는 경우

답변

1
  1. , 그것은 오직 정의를 일치합니다. talk에는 0 개의 매개 변수가 필요하므로 직접 전달할 수 있습니다. sword은 하나의 매개 변수를 취하므로 전달하기 전에 0 개의 매개 변수를 사용하는 익명의 함수로 묶어야합니다.
  2. 각 절의 정의에있는 숫자는 패턴 일치의 예입니다. sword1과 함께 인수로 사용하면 sword(1) ->의 코드가 실행됩니다. 인수로 2을 전달하면 sword(2) -> 절을 실행합니다. 좀 더 자세한 설명을 원하시면 Learn You Some Erlang의 this section을 참조하십시오.
  3. sword에는 1의 값이 있으므로 매개 변수를 올바르게 계산하고 있습니다.
1

sword 기능의 목적은 발생할 수있는 여러 종류의 오류를 과시하는 것입니다. 그것은 하나 이상의 절을 가질 수 있도록 매개 변수를 승인합니다. Fred는 아마도 정수를 선택했을 것입니다.하지만 정수는 중요하지 않습니다. sword 함수는 실제로 1의 값을가집니다.

black_knight/1 함수는 Erlang에있는 다양한 오류 클래스를 잡는 방법을 보여줍니다. zero-arity 함수를 전달하여 전달할 수있는 다른 오류에 대해 다른 응답을 제공함으로써이 작업을 수행합니다.

sword/1black_knight/1 만 인수에 대응 제로의 기능을 허용 때문에 익명 함수를 사용 black_knight/1로 전달된다.

fun() -> sword(1) end 

에 의해 생성되는 익명 함수는 하나 개의 인수를 sword/1를 호출 인수에 대응 제로의 함수이다.

talk/0은 이미 0 아티 기능이기 때문에 직접 전달할 수 있습니다.