如果我想输入一个案例,我会做以下事情:
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
方法,但我对上述方法的运作方式更加好奇。
答案 0 :(得分:10)
不幸的是,这是不可能的。它与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 <- 1..10, b <- 1..10, do: a + b
。)
使用for
可以做的最好的事情是管道进入匿名函数。它不是很漂亮,但是当我想要for
或Enum.each
不支持的Enum.map
功能时,我已经使用了几次(多个子句,内联过滤器,{ {1}}等。)
into