2017-05-04 8 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

もう1つのしわについて考えてみましょう。元のポスターの例では、addは_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

関連する問題