在Elixir中模拟for循环的最佳方法?

时间:2017-11-28 14:18:58

标签: elixir

常见命令式编程语言提供了多次运行代码块的循环结构?例如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的新手。你们能给我一个小样本代码来学习吗?非常感谢你们所有人!

4 个答案:

答案 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.eachEnum.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。