Elixir - 通过管道运算符传递部分输出

问题描述:

在Elixir中使用管道运算符时,是否可以对从第一个函数传递到第二个函数的输出进行选择性/特定处理?Elixir - 通过管道运算符传递部分输出

例如,我正在三个步骤中处理映射 - 我需要删除两个键,更新不同键的值,最后弹出另一个键,我需要稍后在我的代码中使用其值。这里是什么,我想最好能达到一个例证:

for r <- records do 
    {scope, record} = 
    Map.drop(r, [:__struct__, :__meta__]) 
    |> Map.get_and_update(:id, fn current_value -> 
     {current_value, String.replace(current_value, "join", "scope", global: false)} 
    end) 
    |> Map.pop(:user_id) 

    # SOME OTHER STUFF... 

end 

这样就把你的:__struct__:__meta__键,用“范围”一词替换“加入”更新:id键的值,然后弹出:user_id的关键字,让我用{scope, record},其中scope是弹出键的值,record是修改后的地图。代码当然不起作用。

这里的一个片样品的数据:

records = [ 
    %{__struct__: "foo", __meta__: "bar", id: "resource_join:1234", user_id: "user:1234"}, 
    %{__struct__: "foo", __meta__: "bar", id: "resources_join:5678", user_id: "user:5678"}, 
] 

在该过程的第一步骤的工作,因为drop/2返回刚刚改性地图,这是第一个参数到get_and_update/3正确的输入。但是,get_and_update/3返回一个元组,其中第一个值是该函数替换的值,第二个值是修改后的映射。这是管道链失败的地方,因为pop/2需要映射作为第一个参数,并且在这里它接收一个元组。

有没有一种方法可以控制get_and_update/3的输出,以便返回的元组中的第二个值通过管道传递到pop/2?我已经能够通过将这个链条分成几个部分来获得我需要的输出,但是如果可以将这些链接在一起,我想。

+0

考虑包括数据例子,所以任何人都可以在控制台 –

+0

运行代码,你看着使用[有](HTTP:// learningelixi r.joekain.com/learning-elixir-with/)结合你在那里? – matov

+0

你的意思是在'|> Map.pop(...)''之前加入'|> elem(1)'吗?如果您不关心Map.get_and_update中的旧值,那么还有'Map.update'。 – Dogbert

既然要放弃的元组的第一个元素,只有第二遍Map.pop,您可以添加|> elem(1)到管道:

|> Map.get_and_update(:id, fn current_value -> 
    {current_value, String.replace(current_value, "join", "scope", global: false)} 
end) 
|> elem(1) 
|> Map.pop(:user_id) 

此外,Map.get_and_update + elem(1)可以只用Map.update替代,这不返回键的旧值:

|> Map.update(fn current_value -> 
    String.replace(current_value, "join", "scope", global: false) 
end) 
|> Map.pop(:user_id)