pipe - 结合 Enum.map 和 Enum.each

标签 pipe elixir

我是 Elixir 的新手,我正在学习和阅读有关列表/枚举用法和函数管道的一些内容。

我学会了如何组合 Enum.mapEnum.each,例如操作列表的内容并将结果列表打印到控制台

people = ["Qui", "Quo", "Qua"]
people
    |> Enum.map(&String.upcase/1)
    |> Enum.map(&Hello.hello/1)
    |> Enum.each(&IO.puts/1)

我想知道它是否存在将 Enum.mapEnum.each 组合在一起的库函数:我的想法是为列表的每个做一些事情element AND 返回未触及的列表,以便继续管道函数调用。 当然,我可以向传递给 Enum.map 的函数添加副作用,但我不太喜欢这种方法,我希望将副作用与功能显式分开/em> 转换。

我阅读了 EnumList 文档,但我不知道该怎么做: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)

我在工作(编写这段代码对我来说在教学上非常有用),但我想知道

  1. 如果标准库中有内置的东西
  2. 如果我的手工解决方案在 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/

相关文章:

elixir - Elixir 中的同步障碍?

c++ - 为什么在 Windows/unix/linux 中使用管道被认为是危险的?

ffmpeg - Directshow,将流传递给 ffmpeg 之类的程序

c - 管道设置终端到 gnuplot 管道在屏幕上产生垃圾

shell - 如何冲洗当前正在运行的所有管道?

curl - 如何使用HTTPoison在Elixir中执行DELETE?

python - Python 中的 All-to-All 线程通信

elixir - 设置生产端口号时出现问题 - (RuntimeError) 期望设置 PORT 环境变量

erlang - 如何使用 hackney 在 elixir 中发送 body 参数

elixir - 有没有办法可以在 Elixir 中返回函数定义