常见命令式编程语言提供了多次运行代码块的循环结构?例如for循环: 伪代码:
for(i=0;i<256;++i){
expression one;
statement one;
many code goes here
}
for循环中的大块代码将被执行多次。 但作为函数式编程语言,Elixir不提供循环。我知道Enum模块提供了很多次迭代代码的功能。 e.g。
Enum.each(0..99, fn(x) -> IO.puts "hello, world!" end)
上面的代码将被执行100次。打印100&#34;你好,世界!&#34;但它只是一个单行的声明。如何在Elixir中执行大量代码? Elixir的正确方法是什么?我是Elixir的新手。你们能给我一个小样本代码来学习吗?非常感谢你们所有人!
答案 0 :(得分:9)
你的问题中有足够好的解决方案。 Enum.each是将函数X次应用的一种真正的方法。
也许如果我们将其格式化不同,您可能会看到自己可以做的......
Enum.each(0..99, fn(x) ->
IO.puts "hello, world!"
end)
该函数与任何其他函数一样,除了它是内联定义的。
所以,只需添加更多行代码......
Enum.each(0..99, fn(x) ->
IO.puts "hello, world!"
IO.puts x
end)
如果要引用已定义的函数,可以传递函数签名:
defmodule Test do
def bar(x) do
IO.puts "hello, world!"
IO.puts x
end
def foo do
Enum.each(0..99, &bar/1)
end
end
答案 1 :(得分:4)
有很多方法可以做到这一点。您可以编写自己的递归函数,也可以按照here提到的其他示例。
您还可以将代码“块”定义为单独的函数(匿名或命名),并在Enum.each
或Enum.map
中使用它,具体取决于确切需要返回的内容。
或者实际上是这样用的:
for x <- 0..10 do
yor_block_of_code
end
答案 2 :(得分:3)
对于延迟迭代,可以使用Stream.iterate/2
:
1
|> Stream.iterate(& &1+1)
|> Stream.each(&IO.puts(&1))
|> Enum.take(99)
答案 3 :(得分:0)
这是在功能代码中模拟 for 循环的一般模式:
defmodule Test do
def for_loop(f,counter,upper_limit) do
if counter < upper_limit do
f.()
for_loop(f, counter+1, upper_limit) # Note recursive call here
else
nil
end
end
end
你会调用这样的调用:
Test.for_loop(fn() -> IO.puts "Hello" end,0,100)
请注意,我在此代码中不能非常具体,因为该调用中f
的行为将影响循环本身的某些编码。
然而,这是一般模式 - 递归调用函数传递一个计数器,每次调用时递增1。