0

我目前正在学习长生不老药,我正在尝试打印函数及其数量

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
4

2 回答 2

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: Enum."-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,即:ok,并将其作为第二个参数传递给Enum.each。这导致BadFunctionError因为Enum.each期望一个函数作为它的第二个参数,但是你给出了执行函数的结果 - atom :ok

于 2019-03-19T13:41:19.990 回答
0

你的问题是你如何传递printEnum.each. 该变量print已经绑定到一个函数。当你这样做时,print.()你正在调用不带参数的函数并将结果传递给Enum.each. 您想要的是将print函数本身作为参数传递给Enum.each. 所以:

Enum.__info__(:functions) |> Enum.each(print)
于 2019-03-18T15:36:49.897 回答