Sam*_*ton 5 syntax for-loop elixir
如果我想输入一个案例,我会做以下事情:
amount
|> calculate
|> case do
1 -> "one"
2 -> "two"
_ -> "many"
end
Run Code Online (Sandbox Code Playgroud)
是否有可能以for
类似的方式管道循环,例如:
amounts
|> calculate
|> for do
IO.inspect &1
end
Run Code Online (Sandbox Code Playgroud)
要么
amounts
|> calculate
|> Kernel.for(&IO.inspect/1)
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用这些Enum
方法,但我更好奇上面的方法是如何工作的.
Dog*_*ert 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}]}
]
]}
Run Code Online (Sandbox Code Playgroud)
(正如你所看到的,for
取一个参数就是整个值a <- 1..10, b <- 1..10, do: a + b
.)
你可以做的最好的事情for
就是管道进入一个匿名函数.它并不漂亮但我已经使用了几次,当我想要的功能for
不受支持Enum.each
或Enum.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]
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
544 次 |
最近记录: |