Elixir 管道输出到匿名函数

Elixir piping output to an anonymous function

我目前正在学习 elixir,我正在尝试打印函数及其元数

print = fn ({function , arity}) ->
        IO.puts "#{function}/#{arity}" 
        end

Enum.__info__(:functions) |> Enum.each(print.())

这个returns

** (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

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

Enum.__info__(:functions) |> Enum.each(print)

补充一下 Paweł Obrok 所说的,这个 returns BadArityError 的原因是因为 print.() 调用你的 print 函数没有参数,但它需要一个元组作为它的参数。

这实际上掩盖了真正的问题 - 您正在调用函数而不是将其作为参数传递。如果你通过 print.() 函数调用元组,从而解析 BadArityError,你会得到真正的错误:

Enum.__info__(:functions) |> Enum.each(print.({:foo, :bar}))

foo/bar
** (BadFunctionError) expected a function, got: :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输出中看到的那样,然后returnsIO.puts/1的结果,这是 :ok,并将其作为第二个参数传递给 Enum.each。这导致 BadFunctionError 因为 Enum.each 需要一个函数作为它的第二个参数,但是你给出了执行该函数的结果 - 原子 :ok.