【问题标题】:How to pipe in to for loop elixir如何通过管道输入for循环长生不老药
【发布时间】:2018-02-28 10:21:42
【问题描述】:

如果我想通过管道输入一个案例,我会执行以下操作:

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 方法,但我对上述方法的工作原理更加好奇。

【问题讨论】:

  • 旁注: for 是一种理解,而不是常规含义中的循环。

标签: for-loop syntax elixir


【解决方案1】:

很遗憾,这是不可能的。它与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}]}
   ]
 ]}

(如您所见,for 接受一个参数,即整个值 a &lt;- 1..10, b &lt;- 1..10, do: a + b。)

您可以使用for 做的最好的事情是通过管道输入一个匿名函数。它不是很漂亮,但是当我想要Enum.eachEnum.map 不支持的for 的功能(多个子句、内联过滤器、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]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-29
    • 1970-01-01
    • 2016-02-01
    • 1970-01-01
    • 2010-09-16
    • 1970-01-01
    相关资源
    最近更新 更多