如何管道为循环elixir

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何管道为循环elixir相关的知识,希望对你有一定的参考价值。

如果我想输入一个案例,我会做以下事情:

amount
|> calculate
|> case do
  1 -> "one"
  2 -> "two"
  _ -> "many"
end

是否有可能以类似的方式管道进入for循环,例如:

amounts
|> calculate
|> for do
  IO.inspect &1
end

要么

amounts
|> calculate
|> Kernel.for(&IO.inspect/1)

我知道我可以使用Enum方法,但我更好奇上面的方法是如何工作的。

答案

不幸的是,这是不可能的。它与case一起使用的原因是case是一个宏,其第一个参数是一个值,第二个是匹配子句。另一方面,for只有一个参数,包括所有子句和do块:

iex(1)> quote do
...(1)>   for a <- 1..10, b <- 1..10, do: a + b
...(1)> end
{:for, [],
 [
   {:<-, [],
    [{:a, [], Elixir}, {:.., [context: Elixir, import: Kernel], [1, 10]}]},
   {:<-, [],
    [{:b, [], Elixir}, {:.., [context: Elixir, import: Kernel], [1, 10]}]},
   [
     do: {:+, [context: Elixir, import: Kernel],
      [{:a, [], Elixir}, {:b, [], Elixir}]}
   ]
 ]}

(正如你所看到的,qazxsw poi采用一个参数,这是qazxsw poi的全部价值。)

使用for可以做的最好的事情就是管理一个匿名函数。它并不漂亮,但是当我想要a <- 1..10, b <- 1..10, do: a + bfor(多个子句,内联过滤器,for等)不支持的Enum.each的功能时,我已经使用了几次。

Enum.map

以上是关于如何管道为循环elixir的主要内容,如果未能解决你的问题,请参考以下文章

Ruby 中类似 Elixir 的管道来处理集合

Elixir Enum.map 通过管道传送到 Enum.filter 不起作用

Elixir - 循环并添加到地图

Erlang之父学习Elixir语言的一周

如何使用事件侦听器来加载动画片段的循环

如何在Elixir或Erlang中在运行时动态创建和加载模块?