【问题标题】:Pattern match a list of any size in Elixir模式匹配 Elixir 中任意大小的列表
【发布时间】:2018-10-20 15:13:44
【问题描述】:

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

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

【问题讨论】:

    标签: elixir


    【解决方案1】:

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

    不过,您可以使用函数保护来做到这一点,使用 is_list/1:

    def doit(my_list) when is_list(my_list) do
      # my_list is guaranteed to be a list
    end
    

    【讨论】:

    • 我自己刚刚想通了,但想知道是否还有使用模式匹配的方法。将在几分钟内接受。谢谢!
    【解决方案2】:

    你可以像下面这样使用纯模式匹配而没有保护:

    def any_list(list = [head | tail = []]) 做 IO.puts("单个元素") 结束

    def any_list(list = [head | tail ]) 做 IO.puts("任何列表") 结束

    def any_list([]) 做 IO.puts("空列表") 结束

    【讨论】:

      【解决方案3】:

      作为模式匹配的替代方法,您可以使用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
      

      【讨论】:

        猜你喜欢
        • 2016-11-07
        • 1970-01-01
        • 1970-01-01
        • 2022-01-02
        • 1970-01-01
        • 1970-01-01
        • 2011-04-20
        • 2017-06-11
        • 1970-01-01
        相关资源
        最近更新 更多