繁体   English   中英

如何管道为循环elixir

[英]How to pipe in to for loop 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是一个宏,它的第一个参数是一个值,第二个是match子句。 另一方面, 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}]}
   ]
 ]}

(正如你所看到的, for一个参数,它是整个值a <- 1..10, b <- 1..10, do: a + b 。)

你可以做的最好for是管道进入一个匿名函数。 这是不漂亮,但我已经使用这个一对夫妇的时候,我想的功能for所不支持Enum.eachEnum.map (多个条款,在线过滤器, into等)。

iex(2)> 1..5 |> (fn x -> for(i <- x, do: IO.puts(i)) end).()
1
2
3
4
5
[:ok, :ok, :ok, :ok, :ok]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM