Elixir - 循环



由于不可变性,Elixir 中的循环(与任何函数式编程语言一样)与命令式语言中的写法不同。例如,在像 C 这样的命令式语言中,你会这样写:

for(i = 0; i < 10; i++) {
   printf("%d", array[i]);
}

在上例中,我们同时修改了数组和变量i。在 Elixir 中这是不可能的。相反,函数式语言依赖于递归:一个函数递归调用自身,直到满足某个条件停止递归。在这个过程中没有数据被修改。

现在让我们用递归写一个简单的循环,打印 n 次 hello。

defmodule Loop do
   def print_multiple_times(msg, n) when n <= 1 do
      IO.puts msg
   end

   def print_multiple_times(msg, n) do
      IO.puts msg
      print_multiple_times(msg, n - 1)
   end
end

Loop.print_multiple_times("Hello", 10)

运行上述程序后,会产生以下结果:

Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello

我们利用函数的模式匹配技术和递归成功地实现了循环。递归定义难以理解,但将循环转换为递归很容易。

Elixir 提供了Enum 模块。这个模块用于大多数迭代循环调用,因为它比尝试为相同的目的找出递归定义更容易使用。我们将在下一章讨论这些。只有在找不到使用该模块的解决方案时,才应使用您自己的递归定义。这些函数经过尾调用优化,速度很快。

广告