我是Elixir的新手。我想定义一个只接受列表的函数,但它可以是任何大小。
我可以定义一个接受这样的空列表的函数:
def doit(my_list = []) do
IO.puts my_list
end
或只是一个项目,如下:
def doit([first]) do
IO.puts my_list
end
但我如何允许任何尺码列表?我知道我可以接受这样的任何:
def doit(my_list) do
IO.puts my_list
end
但是强制它是一个使用模式匹配的列表是不是更正确?
答案 0 :(得分:14)
据我所知,没有任何单一模式可以匹配任何列表。 - (void)stopRecording {
[self.recorder pause];
[self.recorder stop];
self.recorder = nil;
[self.audioSession setActive:NO error:nil];
self.audioSession = nil;
}
将匹配一个空列表,[]
将匹配任何非空列表,但无法使用模式组合它们。
您可以使用[_ | _]
:
is_list/1
答案 1 :(得分:2)
作为模式匹配的替代方法,您可以使用is_list/1 guard function,它对函数参数进行类型检查:
def doit(my_list) when is_list(my_list) do
# code goes here
end
如果需要,甚至可以使用尺寸检查:
def doit(my_list) when is_list(my_list) and length(my_list) > 0 do
# code goes here
end
答案 2 :(得分:2)
您可以使用纯模式匹配且没有警卫的情况如下所示:
def any_list(list = [head | tail = []])做 IO.puts(“单个元素”) 结束
def any_list(list = [head | tail])做 IO.puts(“任何列表”) 结束
def any_list([])做 IO.puts(“空列表”) 结束