传递地图时出现FunctionClauseError

时间:2019-03-02 18:34:46

标签: elixir

以下功能需要地图

 def process_info({k, v}) do
   --- code---
 end

当我使用my_map调用上述函数时  %{"tt1034415" => "Suspiria"}就像

process_info(my_map)

然后出现以下错误

** (FunctionClauseError) no function clause matching in MOVIEMATCH.process_info/1    

    The following arguments were given to MOVIEMATCH.process_info/1:

        # 1
        %{"tt1034415" => "Suspiria"}

    Attempted function clauses (showing 1 out of 1):

        def process_info({k, v})

2 个答案:

答案 0 :(得分:1)

{k, v}是一个元组,%{k => v}是一个映射。您的函数需要一个元组。

您可能很想尝试通过更改def_process的定义以期望映射来解决此问题:

def process_info(%{k => v})

但是,这不起作用。原因是与函数参数中的映射匹配的模式旨在让您从映射中选择相关数据以在函数内部进行处理。例如,下面的地图:

%{"one" => 1, "two" => 2}

可以像这样进行模式匹配:

def process_info(%{"one" => one})

然后在函数中,one的值为1。因此,您需要事先知道要匹配的键的名称。

在不了解--- code ---的内容以及调用process_info/1之前会发生什么的情况下很难分辨,但是一种方法是将地图转换为元组:

[tuple] = Map.to_list(my_map)

首先生成不带映射的元组是一个更好的设计。

答案 1 :(得分:0)

您正在尝试针对Tuple而不是Map进行图案匹配。

对于Map,您需要执行以下操作:

def process_info(%{"tt1034415" => value}) do
    # your code
end
  

另外,请注意,您不能在地图键上使用变量来进行模式匹配,需要在键上明确显示