elixir管道,如果新变量可以管道,如果直接送到管道就不能管道,为什么?

Ter*_*how 1 elixir phoenix-framework

我有一个嵌套的模型,并希望做一些基本的管道.我的最终目标是删除任何嵌套映射,其中id == ""包含以下参数:

params = %{"name" => "OuterModelName", "InnerModel" => %{"0" => %{"id" => "2"}, "1" => %{"id" => "3"}, "2" => %{"id" => ""}}}

要删除id ==""以下管道工程:

blanksRemoved = 
        params 
        |> Map.update! "InnerModel", fn(innerMap) -> 
            Enum.filter(innerMap,fn{k,v} -> byte_size(v["id"]) !=0 end) end
Run Code Online (Sandbox Code Playgroud)

blanksRemoved现在是:

%{"name" => "OuterModelName", "InnerModel" => [{"0", %{"id" => "2"}}, {"1", %{"id" => "3"}}]}

注意innerModel变成了一个数组,所以我需要将该数组转换回结构.

asStruct = 
      blanksRemoved |> Map.update! "InnerModel", fn(innerMap) -> 
            Enum.into(innerMap,%{}) end 
Run Code Online (Sandbox Code Playgroud)

这符合预期,我得到:

%{"name" => "OuterModelName", "InnerModel" => %{"0" => %{"id" => "2"}, "1" => %{"id" => "3"}}}

但是,当我尝试简单地将两个管道与下面的管道组合时,我得到一个错误.

combinedPipes = 
        params 
        |> Map.update! "InnerModel", fn(innerMap) -> 
            Enum.filter(innerMap,fn{k,v} -> byte_size(v["id"]) !=0 end) end
        |> Map.update! "InnerModel", fn(innerMap) -> 
            Enum.into(innerMap,%{}) end 
Run Code Online (Sandbox Code Playgroud)

而错误:

argument error
    (stdlib) :maps.find("InnerModel", #Function<2.64012156
Run Code Online (Sandbox Code Playgroud)

我知道错误是因为它无法找到"InnerModel"但我不知道为什么当我分开管道时它无法找到它.谁能告诉我这里发生了什么?

Gaz*_*ler 5

编辑在Elixir的主分支上,如果存在参数,编译器将警告函数是否在没有括号的情况下被管道输入.


您需要在函数调用周围使用显式括号,因为函数调用的优先级高于管道运算符.

combinedPipes = 
        params 
        |> Map.update!("InnerModel", fn(innerMap) -> 
            Enum.filter(innerMap,fn{k,v} -> byte_size(v["id"]) !=0 end) end)
        |> Map.update!("InnerModel", fn(innerMap) -> 
            Enum.into(innerMap,%{}) end)
Run Code Online (Sandbox Code Playgroud)

你可以在为什么我不能链String.replace上阅读更详细的解释