我是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
作为模式匹配的替代方法,您可以使用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)
| 归档时间: |
|
| 查看次数: |
6016 次 |
| 最近记录: |