2016-11-13 1 views
0

필자의 함수가 머리에서 직접 패턴 매칭을한다는 것을 감안할 때 함수를 호출하지 않고 주어진 입력에 대해 일치하는 패턴이 있는지 확인하는 방법이 있습니까? 친절 match?하지만 기능을 좋아해. 내가 when에 대해 신경 쓰지 않고 투플 (tuples) 내부의 원자 또는 원자와 만 일치합니다.기능 헤드의 패턴이 일치하는지 확인하십시오.

def init(:ok) do 
    ... 
end 

check(&init/1, :ok) # return true 
check(&init/1, :other) # return false 

나는 입력의 일부를 처리하는 함수 목록을 사용하여 GenServer에서 상태를 변경하고, 다른 사람을 무시하고있다. 각 함수는 하나의 튜플을 취해 함수 헤드가 일치하면 수정 된 상태를 반환하고 일치하지 않으면 상태를 반환합니다. 이 시도/구조 래퍼 함수가이 지금은 꽤되지 않습니다. 입력은 가변 길이 튜플이며 첫 번째 요소는 원자 식별자입니다.

+0

이 작업으로 무엇을하려합니까? 좀 더 많은 맥락을 감안할 때 문제에 대한보다 솔직한 해결책을 제시 할 수 있습니다. –

+0

@PatrickOscity가 업데이트되었습니다. 여전히 불분명한지 여쭈어보십시오. –

+0

@FilipHaglund 기능 헤드가 기능을 실행하지 않고 일치하는지 확인할 수는 없지만 기존 도구로 동일한 목표를 달성 할 수있는 여러 가지 방법이있을 수 있다고 생각합니다. 더 많은 코드를 보여줄 수 있습니까? 네가하려는 일을하는 데 어려움을 겪고있다. | – whatyouhide

답변

0

엄밀히 말하면 불가능합니다. Elixir.FunctionClauseError은 단순히 erlang function_clauseruntime error의 래퍼입니다.

확인은 즉시 수행되며, 특정 절을 검사 할 수 있지만 검사 할 준비가 된 절 목록은 없습니다. 좋은 예가 당신 앞에서 앉아있는 탐욕스러운 고양이 일 것입니다. 당신은 그녀에게 사과, 당근 또는 심지어 클립을 먹일 수도 있지만, 시도하지 않았다면, 그녀가 먹을 지 말지를 말할 수 없습니다.

한편, 항상 Module.__info__ :functions에 대한 쿼리 옵션이 있습니다. 그것은 하나의 반응으로 응답하기 때문에 누구나 Elixir.UndefinedFunctionError을 감지하고 거부 할 수 있습니다.

하지만 단락 일치는 런타임에 수행되므로 허용 된 조항 목록을받을 방법이 없습니다. 이 절이 경비원 (when,)의 명시적인 매개 변수 (:ok)의 번거로운 고민 일 수 있으며 중복 될 수도 있다고 생각하십시오. 이 명시된 바와 같이


질문 :

check(&init/1, :ok) # return true 
check(&init/1, :other) # return false 

은 그래도 bruteforce의 솔루션을 제공합니다. 추천하지는 않지만 여전히 사용 가능합니다. check으로 구현하고 Elixir.FunctionClauseError에서 기능 및 구조를 호출하십시오.

제발, 공유하지 말아주세요. 나는 이것을 제안한 사람이었습니다.

+0

당신의 무차별 대치 솔루션은 현재 사용하고있는 솔루션이지만, 일반적인 경우에는 불가능하다고 나는 동의하지 않습니다. 함수 절의 첫 번째 인수를 추출하고'match? '또는 대소 문자를 사용하는 매크로를 작성할 수 있습니다. 적은 마법으로 더 관용적 인 솔루션을 요구하고 있습니다. 여기에는 중단 문제가 없습니다. –

+0

"복잡한 가드가없는 한"함수 절의 첫 번째 인수를 추출하는 매크로를 작성할 수 있습니다. " 이것은 어떤 절이 일치하는지에 대한 매우 제한적이고 고안된 예제이며이 구현은 적법한 Elixir 절에서 실패합니다. 내 요점은 "일반적인 엘릭서 기능으로는 불가능한 이유입니다." – mudasobwa

+0

그러나 나는 그런 엄격한 제약이 없습니다. –

관련 문제