我目前正在学习灵丹妙药,我正在尝试打印功能及其特性
print = fn ({function , arity}) ->
IO.puts "#{function}/#{arity}"
end
Enum.__info__(:functions) |> Enum.each(print.())
这将返回
** (BadArityError) #Function<0.60149952 in file:learn.exs> with arity 1 called with no arguments
learn.exs:5: (file)
(elixir) lib/code.ex:767: Code.require_file/2
答案 0 :(得分:1)
要补充PawełObrok所说的话,之所以返回BadArityError
是因为print.()
调用了您的print
函数,但没有参数,但是它希望有一个元组作为参数。
这实际上掩盖了真正的问题-您在调用函数而不是将其作为参数传递。如果您通过print.()
函数调用一个元组,从而解决了BadArityError
,则会收到真正的错误:
Enum.__info__(:functions) |> Enum.each(print.({:foo, :bar}))
foo / bar
**(BadFunctionError)需要一个函数,得到::ok
(elixir)lib / enum.ex:769:枚举。“-each / 2-lists ^ foreach / 1-0-” / 2
(elixir)lib / enum.ex:769:Enum.each / 2
执行print
函数,执行IO.puts "#{function}/#{arity}"
输出中的foo/bar
,然后返回IO.puts/1
的结果,{{1} },并将其作为第二个参数传递给:ok
。之所以导致Enum.each
是因为BadFunctionError
期望函数作为其第二个参数,但是您给出了执行该函数的结果-原子Enum.each
。
答案 1 :(得分:0)
您的问题是如何将print
传递给Enum.each
。变量print
已绑定到函数。当您执行print.()
时,您将在不带参数的情况下调用该函数,并将结果传递给Enum.each
。相反,您想要的是将print
函数本身作为参数传递给Enum.each
。所以:
Enum.__info__(:functions) |> Enum.each(print)