elixir 管道,如果是新变量可以管道,如果直接发送到管道则不能管道,为什么?
elixir piping, can pipe if new variable, can't pipe if sending directly to pipe, why?
我有一个嵌套模型,想做一些基本的管道。我的最终目标是删除任何嵌套地图,其中 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
blanksRemoved 现在是:
%{"name" => "OuterModelName", "InnerModel" => [{"0", %{"id" => "2"}}, {"1", %{"id" => "3"}}]}
注意 innerModel 变成了一个数组,所以我需要将该数组转回一个结构。
asStruct =
blanksRemoved |> Map.update! "InnerModel", fn(innerMap) ->
Enum.into(innerMap,%{}) end
按预期工作,我得到:
%{"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
错误:
argument error
(stdlib) :maps.find("InnerModel", #Function<2.64012156
我知道错误是因为它找不到 "InnerModel" 但我不知道为什么它在我分开管道时找不到它。谁能告诉我这是怎么回事?
EDIT 在 Elixir 的 master 分支上,如果函数在没有括号的情况下通过管道传输,如果有参数,编译器将发出警告。
您需要在函数调用前后加上显式括号,因为函数调用的优先级高于管道运算符。
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)
您可以在
阅读更详细的解释
我有一个嵌套模型,想做一些基本的管道。我的最终目标是删除任何嵌套地图,其中 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
blanksRemoved 现在是:
%{"name" => "OuterModelName", "InnerModel" => [{"0", %{"id" => "2"}}, {"1", %{"id" => "3"}}]}
注意 innerModel 变成了一个数组,所以我需要将该数组转回一个结构。
asStruct =
blanksRemoved |> Map.update! "InnerModel", fn(innerMap) ->
Enum.into(innerMap,%{}) end
按预期工作,我得到:
%{"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
错误:
argument error
(stdlib) :maps.find("InnerModel", #Function<2.64012156
我知道错误是因为它找不到 "InnerModel" 但我不知道为什么它在我分开管道时找不到它。谁能告诉我这是怎么回事?
EDIT 在 Elixir 的 master 分支上,如果函数在没有括号的情况下通过管道传输,如果有参数,编译器将发出警告。
您需要在函数调用前后加上显式括号,因为函数调用的优先级高于管道运算符。
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)
您可以在