2017-05-04 1 views
2

내가 is_function와 일부 내장 함수를 테스트하기를 원하지만 실패 :비약 : is_function

> add = fn a, b -> a + b end 
#Function<12.118419387/2 in :erl_eval.expr/5> 

> is_function add 
true 

> is_function is_function # test itself 
warning: variable "is_function" does not exist and is being expanded to "is_function()", please use parentheses to remove the ambiguity or change the variable name 
    iex:27 

어떻게 내장 함수를 테스트하기 위해?

답변

4

당신은 Kernel.function_exported?/3를 사용하고 그것을 모듈 이름, 함수 이름을 전달하고, 인수에 대응 확인할 수 있습니다 비약에 호출 할 수 있습니다

iex(1)> function_exported?(Kernel, :is_function, 1) 
true 
iex(2)> function_exported?(Kernel, :is_function, 2) 
true 
iex(3)> function_exported?(Kernel, :is_function, 3) 
false 
iex(4)> function_exported?(Kernel, :function_exported?, 3) 
true 

(모든 기능을 모든 모듈을 가져 오지 않고, 예를 들면 is_function 또는 +는에 정의되어 있습니다 Kernel 모듈입니다.)

0

@Dogbert가 말한 것 이외에도 is_function(&is_function/1)을 사용하여 범위에 해당 기능이 있는지 확인할 수 있습니다. 이러한 구문은 Elixir에서 함수 이름과 변수 이름간에 차이가 없어야하므로 필요합니다.

+0

또 하나의 주름에 대해 생각해보십시오. 원래 포스터의 예제에서 람다가 포함 된 _variable_입니다. is_function은 명명 된 함수입니다. 나는 is_function (& is_function/1)은 작동하지만 is_function (& add/0)은 작동하지 않는다고 말합니다. 둘 다 is_function (& add/2)도하지 않습니다. 완전을 위해서. –

+1

false를 반환하지 않습니다. 모듈'A'가 존재하지 않더라도'is_function (& A.b/1) # => 참 '입니다. – Dogbert

+0

로컬 함수의 경우 함수가 존재하지 않으면 컴파일 타임 오류가 발생합니다. – Dogbert