【问题标题】:Elixir - Passing multiple lists as function parametersElixir - 将多个列表作为函数参数传递
【发布时间】:2018-01-02 15:01:59
【问题描述】:

我是 Elixir 的新手,但我的谷歌搜索和阅读并没有找到我当前问题的解决方案。我只在书籍和教程中看到了将单个列表参数传递给如下函数的示例:[ head | tail ]

defmodule Math do
  def double_each([head|tail]) do
    [head * 2| double_each(tail)]
  end

  def double_each([]) do
    []
  end
end

我需要传入两个列表,然后对它们执行一些操作,如下所示:

defmodule Pagination do
  def getPaginatedList([], _, _, _) do
    []
  end

  def getPaginatedList([list], [paginated], f, l) when f == 1 do
    Enum.take(list, l)
  end

  def getPaginatedList(_, [paginated], f, l) when l <= f do
    paginated
  end

  def getPaginatedList([list], [paginated] \\ [], f, l) do
    getPaginatedList(tl(list), paginated ++ hd(list), f, l - 1)
  end
end

但是,当传入 a 的列表和 b 的列表时,我收到一个关于 function 子句不匹配的错误,如下面的错误所示:

iex(23)> Pagination.getPaginatedList(a, b, 1, 2)
** (FunctionClauseError) no function clause matching
      in Pagination.getPaginatedList/4
    pagination.ex:2: Pagination.getPaginatedList([1, 2, 3, 4, 5], [], 1, 2)

关于我可能做错了什么有什么想法吗? (抱歉,如果这是一个简单的问题要回答。经过几个小时的搜索和玩弄后,我无法找到任何答案。)

【问题讨论】:

    标签: list function pagination elixir


    【解决方案1】:

    您的问题是列表参数模式匹配。对于 listpaginated 参数,您不需要将它们包装在列表中,因为您实际上是在嵌套列表中匹配。此外,通常在 Elixir 中使用蛇形大小写作为函数名称。试一试:

    defmodule Pagination do
      def get_paginated_list([], _, _, _) do
        []
      end
    
      def get_paginated_list(list, paginated, f, l) when f == 1 do
        Enum.take(list, l)
      end
    
      def get_paginated_list(_, paginated, f, l) when l <= f do
        paginated
      end
    
      def get_paginated_list(list, paginated \\ [], f, l) do
        get_paginated_list(tl(list), paginated ++ hd(list), f, l - 1)
      end
    end
    

    【讨论】:

      【解决方案2】:

      @Chris 解决了你遇到的错误信息,我只补充一点,方法签名不是很“灵丹妙药”。

      以下方法签名更符合语言的精神和编码风格(我已经更改了一些参数名称以更具可读性):

      defmodule Pagination do
        def get_paginated_list([], _, _, _) do
          []
        end
      
        def get_paginated_list(list, _, page_num, page_size) when page_num == 1 do
          Enum.take(list, page_size)
        end
      
        def get_paginated_list(_, paginated, page_num, page_size) when page_size <= page_num do
          paginated
        end
      
        def get_paginated_list([head | tail], paginated \\ [], page_num, page_size) do
          get_paginated_list(tail, paginated ++ [head], page_num, page_size - 1)
        end
      end
      

      我不确定你的代码的语义应该是什么,但对于分页,我想你可能想看看Enum.chunk/4,你可以像这样使用它:

      defmodule Pagination do   
        def get_paginated_list(list, page_num, page_size) do
          list |> Enum.chunk(page_size, page_size, []) |>  Enum.at(page_num)
        end
      end
      
      Pagination.get_paginated_list([1, 2, 3, 4, 5], 1, 3)
      # => [4, 5]
      Pagination.get_paginated_list([1, 2, 3, 4, 5], 0, 3)
      # => [1, 2, 3]
      Pagination.get_paginated_list([1, 2, 3, 4, 5], 2, 3)
      # => nil
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-08-03
        • 1970-01-01
        • 1970-01-01
        • 2014-04-29
        • 2022-01-06
        • 1970-01-01
        • 2012-03-07
        • 2016-08-05
        相关资源
        最近更新 更多