我是 Elixir 的新手,我正在学习和阅读有关列表/枚举用法和函数管道的一些内容。
我学会了如何组合 Enum.map
和 Enum.each
,例如操作列表的内容并将结果列表打印到控制台
people = ["Qui", "Quo", "Qua"]
people
|> Enum.map(&String.upcase/1)
|> Enum.map(&Hello.hello/1)
|> Enum.each(&IO.puts/1)
我想知道它是否存在将 Enum.map
和 Enum.each
组合在一起的库函数:我的想法是为列表的每个做一些事情element AND 返回未触及的列表,以便继续管道函数调用。
当然,我可以向传递给 Enum.map
的函数添加副作用,但我不太喜欢这种方法,我希望将副作用与功能显式分开/em> 转换。
我阅读了 Enum
和 List
文档,但我不知道该怎么做:Enum.each
返回 :ok
我找不到类似的返回初始列表的东西。
于是我自己实现如下:
defmodule MyEnum do
def tee list, action do
Enum.map(list, fn item ->
action.(item)
item
end)
end
end
(免责声明:当然,我向 map
添加了副作用,但我将此脏东西隔离到一个函数中,该函数的名称应该澄清我的意图) 并将前面的示例重写为
people = ["Qui", "Quo", "Qua"]
people
|> Enum.map(&String.upcase/1)
|> Enum.map(&Hello.hello/1)
|> MyEnum.tee(&IO.puts/1)
|> Enum.map(&String.upcase/1)
|> Enum.each(&IO.puts/1)
我在工作(编写这段代码对我来说在教学上非常有用),但我想知道
- 如果标准库中有内置的东西
- 如果我的手工解决方案在 Elixir 中是一个好的且惯用的解决方案
提前致谢!
最佳答案
Stream.each会做你想做的,但你需要消耗流来触发效果。
Executes the given function for each item.
Useful for adding side effects (like printing) to a stream.
people
|> Enum.map(&String.upcase/1)
|> Stream.each(&IO.inspect/1)
|> Enum.to_list
关于pipe - 结合 Enum.map 和 Enum.each,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54948835/