【问题标题】:Why function receive extra argument为什么函数接收额外的参数
【发布时间】:2019-09-07 02:44:09
【问题描述】:

当我使用以下代码运行函数时:

elements = ["A", "B"]

for element <- elements, into: [] do
  struct(element, [])
end

Elixir 引发此异常:

** (FunctionClauseError) no function clause matching in Kernel.struct/3

The following arguments were given to Kernel.struct/3:

    # 1
    "A"

    # 2
    []

    # 3
    #Function<18.114860832/2 in Kernel.struct/2>

Attempted function clauses (showing 4 out of 4):

    defp struct(struct, [], _fun) when is_atom(struct)
    defp struct(struct, fields, fun) when is_atom(struct)
    defp struct(%_{} = struct, [], _fun)
    defp struct(%_{} = struct, fields, fun)

为什么 Elixir 将函数作为第三个参数传递给 Kernel.struct 函数?

【问题讨论】:

  • 你运行的是什么版本的 Elixir?我似乎找不到struct/3 的定义,只有struct/2

标签: functional-programming elixir


【解决方案1】:

您看到Kernel.struct/3 的原因是Kernel.struct/2 calls 内部有一个私有Kernel.struct/3 子句。

错误的原因是没有匹配的函数子句,因为第一个参数"A" 不是结构或原子。请阅读documentation for struct/2

struct 参数可以是一个原子(定义defstruct)或struct 本身。

您传递的字符串不是有效参数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-13
    • 2015-08-24
    • 2018-03-24
    • 2011-03-20
    • 1970-01-01
    • 1970-01-01
    • 2012-07-30
    • 1970-01-01
    相关资源
    最近更新 更多