【问题标题】:No function clause matching in Access.get/3Access.get/3 中没有匹配的函数子句
【发布时间】:2021-10-27 17:55:45
【问题描述】:

在我的空闲时间我正在学习 elixir,现在我正在尝试开发简单的 Elixir API。一切正常,除了当我尝试使用 Postman/curl 插入新值时。当我尝试使用此类数据时:

{
    "tree": "nil",
    "value": "5"
}

我收到此错误:(FunctionClauseError) no function clause matching in Access.get/3

这是我在 Endpoint 中的 POST 代码。

post "/insert" do
    IO.inspect(conn.body_params)
    {status, body} =
      case conn.body_params do
        %{"tree" => tree, "value" => value} -> {200, process_insert(tree, value)}
        BstInsertion.insert(tree, value)
        _ -> {400, missing_insert()}
      end

    send_resp(conn, status, body)
  end

插入函数和process_insert示例:

  def insert(nil, value) do
    %{value: value, ltree: nil, rtree: nil}
  end

  defp process_insert(_tree, _value) do
    Poison.encode!(%{response: "Received insert!"})
  end

如果这还不够,我会提供更多代码。感谢您的任何建议和帮助。

【问题讨论】:

  • 您看到的错误是因为您使用错误的参数调用 Access.get/3 函数。是你写的函数吗?我没有看到任何调用该函数的代码。
  • @ChristopheDeTroyer Access.get/3 不是 Elixir 的内置函数吗?我没有在任何地方写Access.get/3函数。
  • 我认为他们的观点是您向我们展示的代码不包括对Access.get/3 的任何调用。也许在你的process_insert/2 函数中?
  • @BrettBeatty 请检查更新的问题。我附上了这个功能的相关代码。
  • 它将转到insert/2 函数的另一个子句,因为tree 的值是"nil",而不是nil。如果我理解您的意图,您可能希望在您的 JSON 中传递 "tree": null。当它只是字符串“nil”时,您的下一个子句可能需要一个现有的tree。接下来你会遇到问题,{status, body} 不是从case 的第一个子句返回的:而是返回insert/2 的结果,这似乎是代表你的树的地图。

标签: elixir plug


【解决方案1】:

我认为您的代码有问题。我已经整理了你的代码:

post "/insert" do
  IO.inspect(conn.body_params)
  {status, body} =
    case conn.body_params do
      %{"tree" => tree, "value" => value} ->
        {200, process_insert(tree, value)}
        BstInsertion.insert(tree, value) # What is this line? What is the output?
        
      _ ->
        {400, missing_insert()}
    end

  send_resp(conn, status, body)
end

每个子句/函数的最后一行是返回值。所以你的第一个case 子句返回BstInsertion.insert(tree, value) 的值。这是你所期望的吗?从上一行来看,我可以说不是。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-26
    • 2023-03-13
    • 2015-03-20
    • 2019-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多