模式匹配Elixir中任何大小的列表

时间:2017-07-13 18:32:41

标签: elixir

我是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

但是强制它是一个使用模式匹配的列表是不是更正确?

3 个答案:

答案 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(“空列表”) 结束