【问题标题】:elixir piping, can pipe if new variable, can't pipe if sending directly to pipe, why?长生不老药管道,如果新变量可以管道,如果直接发送到管道,则不能管道,为什么?
【发布时间】:2015-11-16 20:58:21
【问题描述】:

我有一个嵌套模型并想做一些基本的管道。我的最终目标是删除任何嵌套地图,其中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”,但我不知道为什么当我分离管道时它无法找到它。谁能告诉我这里发生了什么?

【问题讨论】:

  • 请记住[{"0", %{"id" =&gt; "2"}}, {"1", %{"id" =&gt; "3"}}] 表示一个列表,而不是一个数组;差异并非微不足道。

标签: elixir phoenix-framework


【解决方案1】:

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)

您可以在Why Can't I Chain String.replace?阅读更详细的说明

【讨论】:

  • 伙计,这是另一个 Elixir 常见问题解答。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-18
  • 2021-12-10
  • 1970-01-01
  • 2021-12-17
  • 1970-01-01
相关资源
最近更新 更多