Elixir:函数签名中的多列表模式匹配
我试图创建一个函数,它接受两个列表作为参数,并且每个列表(a)不是空的,并且(b)是某个结构的列表。这样的东西可以满足我的需要:Elixir:函数签名中的多列表模式匹配,elixir,Elixir,我试图创建一个函数,它接受两个列表作为参数,并且每个列表(a)不是空的,并且(b)是某个结构的列表。这样的东西可以满足我的需要: def zip_sports_and_leagues( [%Sport{} | _tail] = sports, [%League{} | _tail] = leagues ) do # Do stuff with `sports` and `leagues` end 当第一个列表有多个项时,我得到一个与该函数匹配的“no function子句”错误 我
def zip_sports_and_leagues(
[%Sport{} | _tail] = sports,
[%League{} | _tail] = leagues
) do
# Do stuff with `sports` and `leagues`
end
当第一个列表有多个项时,我得到一个与该函数匹配的“no function子句”错误
我已将代码精简为以下示例:
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]
有人能告诉我为什么会出现function子句错误以及如何修复它吗
谢谢 问题是两个参数的尾部使用了相同的名称:
\u tail
。当函数参数中的一个名称被使用两次时,该子句仅在两者具有相同值时匹配。您可以重命名其中一个:
def zip_sports_and_leagues(
[%Sport{} | _tail] = sports,
[%League{} | _tail2] = leagues
) do
# Do stuff with `sports` and `leagues`
end
或者使用不绑定值且可多次使用的:
def zip_sports_and_leagues(
[%Sport{} | _] = sports,
[%League{} | _] = leagues
) do
# Do stuff with `sports` and `leagues`
end