【问题标题】:Elixir piping output to an anonymous functionElixir 管道输出到匿名函数
【发布时间】:2019-08-09 00:30:12
【问题描述】:

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

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

【问题讨论】:

  • 旁注:请使用formatter来格式化你的代码。 mix format 在项目中,或您选择的编辑器的插件。

标签: elixir elixir-iex ex


【解决方案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
(长生不老药) lib/enum.ex:769: Enum.each/2

print 函数被执行,执行 IO.puts "#{function}/#{arity}",正如您从 foo/bar 输出中看到的那样,然后返回 IO.puts/1 的结果,即:ok,并将其作为第二个参数传递给Enum.each。这会导致BadFunctionError,因为Enum.each 需要一个函数作为它的第二个参数,但是你给出了执行函数的结果——原子:ok

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 请使用指南建议的术语开始管道::functions |&gt; Enum.__info__() |&gt; Enum.each(print),特别是在回答问题时。让我们教新人良好的习惯:)
    • 格式化程序不强制使用术语启动管道,因此 IMO 是允许的。此外,我认为在这种情况下它更具可读性。
    猜你喜欢
    • 2014-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-16
    • 2012-07-12
    • 1970-01-01
    相关资源
    最近更新 更多