Elixir管道输出到匿名函数

时间:2019-03-18 15:26:39

标签: elixir iex ex

我目前正在学习灵丹妙药,我正在尝试打印功能及其特性

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

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)