提取管道中元组的第二个元素
Posted
技术标签:
【中文标题】提取管道中元组的第二个元素【英文标题】:Extract the second element of a tuple in a pipeline 【发布时间】:2018-11-02 22:33:21 【问题描述】:我希望能够提取管道中元组的第 N 项,而不使用 with
或以其他方式破坏管道。 Enum.at
可以完美运行,除了元组不是枚举。
这是一个鼓舞人心的例子:
colors = %red: 1, green: 2, blue: 3
data = [:red, :red, :blue]
data
|> Enum.map(&Map.fetch(colors, &1))
|> Enum.unzip
这会返回[:ok, :ok, :ok], [1, 1, 3]
,假设我只想提取[1, 1, 3]
(对于这种特定情况,我可以使用fetch!
,但我的实际代码不存在。)
我可以补充
|> Tuple.to_list
|> Enum.at(1)
有没有更好的方法不需要从每个元组中创建一个临时列表?
【问题讨论】:
【参考方案1】:使用Kernel.elem/2
:
iex(1)> [:ok, :ok, :ok], [1, 1, 3] |> elem(1)
[1, 1, 3]
【讨论】:
啊,我像往常一样想太多了。谢谢【参考方案2】:模式匹配可以提供帮助
_status, required_value =
data
|> Enum.map(&Map.fetch(colors, &1))
|> Enum.unzip
你可以忽略_status
。
【讨论】:
我应该澄清一下,extract
步骤位于管道的中间。使用模式匹配(也是我的首选方式),最终需要中间变量和多个管道:(以上是关于提取管道中元组的第二个元素的主要内容,如果未能解决你的问题,请参考以下文章
如何使 cat 和 grep 在 c 中的第一个和第二个管道中工作,就像 bash 中的 heredoc <<