我正在尝试创建一个接受两个列表作为参数的函数,并且每个列表是(a)不为空和(b)某个结构的列表.这样的东西可以满足我的需求:
def zip_sports_and_leagues(
[%Sport{} | _tail] = sports,
[%League{} | _tail] = leagues
) do
# Do stuff with `sports` and `leagues`
end
Run Code Online (Sandbox Code Playgroud)
当第一个列表有多个项目时,我正在使用该函数获得"无函数子句匹配"错误.
我已经将代码剥离到这个最小的例子:
defmodule Test do
def test([a | _tail], [b | _tail]) do
1
end
end
Test.test([1], [1])
=> 1
Test.test([1, 1], [1])
** (FunctionClauseError) no function clause matching in Test.test/2
The following arguments were given to Test.test/2:
# 1
[1, 1]
# 2
[1]
Run Code Online (Sandbox Code Playgroud)
有人能告诉我为什么我得到函数子句错误以及如何解决它?
谢谢!
问题是你在两个参数的尾部使用相同的名称:_tail.当函数的参数中的名称被使用两次时,该子句仅在两者具有相同值时匹配.您可以重命名其中一个:
def zip_sports_and_leagues(
[%Sport{} | _tail] = sports,
[%League{} | _tail2] = leagues
) do
# Do stuff with `sports` and `leagues`
end
Run Code Online (Sandbox Code Playgroud)
或使用_不绑定值并且可以多次使用:
def zip_sports_and_leagues(
[%Sport{} | _] = sports,
[%League{} | _] = leagues
) do
# Do stuff with `sports` and `leagues`
end
Run Code Online (Sandbox Code Playgroud)