Elixir 长生不老药管道,如果是新变量,can管道,can';t管道如果直接发送到管道,为什么?

Elixir 长生不老药管道,如果是新变量,can管道,can';t管道如果直接发送到管道,为什么?,elixir,phoenix-framework,Elixir,Phoenix Framework,我有一个嵌套模型,想做一些基本的管道。我的最终目标是为以下参数删除id==“”中的任何嵌套映射: params=%%{“name”=>“outerrmodelname”,“InnerModel”=>%%{“0”=>%%{“id”=>“2”},“1”=>%%{“id”=>“3”},“2”=>%%{“id”=>“}}} 要删除id==“”以下管道工程: blanksRemoved = params |> Map.update! "InnerModel", f

我有一个嵌套模型,想做一些基本的管道。我的最终目标是为以下参数删除
id==“”
中的任何嵌套映射:

params=%%{“name”=>“outerrmodelname”,“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
删除的空格现在是:

%{“name”=>“outermormodelname”、“InnerModel”=>[{“0”、“id”=>“2”}、{“1”、“id”=>“3”}]}

请注意,innerModel变成了一个数组,因此我需要将该数组转换回结构

asStruct = 
      blanksRemoved |> Map.update! "InnerModel", fn(innerMap) -> 
            Enum.into(innerMap,%{}) end 
这正是我的初衷,我得到:

%%{“name”=>“outerrmodelname”,“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 
错误是:

argument error
    (stdlib) :maps.find("InnerModel", #Function<2.64012156
参数错误

(stdlib):maps.find(“InnerModel”),#FunctionEDIT在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)

您可以在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)

你可以在

Man这是另一个长生不老药常见问题解答)Man这是另一个长生不老药常见问题解答。:)请记住,
[{“0”、%%{“id”=>“2”}、{“1”、%%{“id”=>“3”}]
表示列表,而不是数组;区别不是微不足道的。请记住,
[{“0”、%%{“id”=>“2”}、{“1”、%%{“id”=>“3”}]
表示列表,而不是数组;两者的区别并非微不足道。