为什么[头|用作arg的语句是否与Elixir中的单个元素数组匹配?

时间:2016-05-02 16:07:17

标签: elixir

我在iex中注意到运行[1] = [ head | tail ]会导致编译错误。但是,如果您定义一个函数,例如:

def simple_func([ head | tail ]) do
  IO.inspect(head)
  IO.inspect(tail)
end

这个论点似乎很匹配。我假设发生了什么事情,我很想知道它是什么。

3 个答案:

答案 0 :(得分:6)

匹配的模式位于=的左侧,而不是右侧:

iex(1)> [head | tail] = [1]
[1]
iex(2)> head
1
iex(3)> tail
[]

答案 1 :(得分:1)

Tail是剩余列表。在一个参数的列表中,它只是一个空列表,所以它实际匹配。

答案 2 :(得分:0)

有三种情况 1.头部和尾部之前未定义:

iex(1)> [1] = [head | tail] 
** (CompileError) iex:5: undefined function head/0
    (stdlib) lists.erl:1353: :lists.mapfoldl/3
    (stdlib) lists.erl:1354: :lists.mapfoldl/3
  1. 使用匹配值定义head和tail iex(1)> head = 1 1 iex(2)> tail = [] [] iex(3)> [1] = [head|tail] 在这种情况下,头部和尾部的组合([head|tail])等于[1]如此匹配且没有错误

  2. 头部和尾部定义为不匹配的值

  3. `

    iex(1)> head = 2
    2
    iex(2)> tail = []
    []
    iex(3)> [1] = [head|tail]
    ** (MatchError) no match of right hand side value: [2]
    

    在这种情况下,head和tail([head|tail])的组合等于[2]所以匹配错误