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
?我已经能够通过将这个链条分成几个部分来获得我需要的输出,但是如果可以将这些链接在一起,我想。
答
既然要放弃的元组的第一个元素,只有第二遍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)
考虑包括数据例子,所以任何人都可以在控制台 –
运行代码,你看着使用[有](HTTP:// learningelixi r.joekain.com/learning-elixir-with/)结合你在那里? – matov
你的意思是在'|> Map.pop(...)''之前加入'|> elem(1)'吗?如果您不关心Map.get_and_update中的旧值,那么还有'Map.update'。 – Dogbert