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

you*_*786 4 elixir

我是Elixir的新手.我想定义一个只接受列表的函数,但它可以是任何大小.

我可以定义一个接受像这样的空列表的函数:

def doit(my_list = []) do
  IO.puts my_list
end
Run Code Online (Sandbox Code Playgroud)

或者只是一个项目,如下所示:

def doit([first]) do
  IO.puts my_list
end
Run Code Online (Sandbox Code Playgroud)

但是如何允许任何尺寸列表?我知道我可以接受这样的事情:

def doit(my_list) do
  IO.puts my_list
end
Run Code Online (Sandbox Code Playgroud)

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

Dog*_*ert 17

据我所知,没有任何一种模式可以匹配任何列表.[]将匹配一个空列表并[_ | _]匹配任何非空列表,但没有办法使用模式组合它们.

您可以使用功能保护来执行此操作,使用is_list/1:

def doit(my_list) when is_list(my_list) do
  # my_list is guaranteed to be a list
end
Run Code Online (Sandbox Code Playgroud)


小智 6

您可以使用纯模式匹配而不使用守卫来执行以下操作:

def any_list(list = [head | tail = []]) do IO.puts("Single Element") end

def any_list(list = [head | tail ]) do IO.puts("Any list") end

def any_list([]) do IO.puts("Empty list") end


Mát*_*áté 5

作为模式匹配的替代方法,您可以使用is_list/1 保护函数,它对函数参数进行类型检查:

def doit(my_list) when is_list(my_list) do
  # code goes here
end
Run Code Online (Sandbox Code Playgroud)

或者甚至在必要时将其与尺寸检查一起使用:

def doit(my_list) when is_list(my_list) and length(my_list) > 0 do
  # code goes here
end
Run Code Online (Sandbox Code Playgroud)