我有一个任意大小的结构列表.
我们称之为l.
l = [%X{a:1}, %X{a:3}, %X{a:9}, %X{a:11}]
大小l不断变化.我想知道的是我如何模式匹配l以确保它总是由结构组成%X{}.如果列表包含其他内容,我希望模式匹配失败.例如:
l = [%X{a:1}, %X{a:3}, %Y{a:9}, %Z{a:11}]
我尝试过的事情
i = %X{}
j = %Y{}
[%X{}|_] = [i,i,i]
Run Code Online (Sandbox Code Playgroud)
但这只匹配第一个元素.
[%X{}|_] = [i,j,j]
Run Code Online (Sandbox Code Playgroud)
我的用例应该失败,但事实并非如此.也许如果有一个运算符或类似的东西,它将匹配特定类型的列表,这正是我正在寻找的:
[%X{}+] = [i,i,i] # Doesn't exist, just an example
Run Code Online (Sandbox Code Playgroud)
一些背景
我在菲尼斯,我有一个post与之has_many关系的模特images.给定的用户可以上传多个图像,我想模式匹配,以确保我%Plug.Upload{}在这种情况下使用正确的struct().
任何帮助深表感谢.谢谢 :)
您不能在列表的每个元素上进行模式匹配(没有递归).在这种情况下,我会使用Enum.all?/2和match?/2宏:
if Enum.all?(list, &match?(%X{}, &1)) do
...
end
Run Code Online (Sandbox Code Playgroud)