Elixir - Vòng lặp

Do tính bất biến, các vòng lặp trong Elixir (như trong bất kỳ ngôn ngữ lập trình chức năng nào) được viết khác với ngôn ngữ mệnh lệnh. Ví dụ, trong một ngôn ngữ mệnh lệnh như C, bạn sẽ viết -

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

Trong ví dụ ở trên, chúng ta đang thay đổi cả mảng và biến i. Không thể gây đột biến trong Elixir. Thay vào đó, các ngôn ngữ chức năng dựa vào đệ quy: một hàm được gọi đệ quy cho đến khi đạt được điều kiện ngăn hành động đệ quy tiếp tục. Không có dữ liệu nào bị thay đổi trong quá trình này.

Bây giờ chúng ta hãy viết một vòng lặp đơn giản bằng cách sử dụng đệ quy in ra hello n lần.

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)

Khi chương trình trên được chạy, nó tạo ra kết quả sau:

Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello

Chúng tôi đã sử dụng các kỹ thuật đối sánh mẫu của hàm và đệ quy để thực hiện thành công một vòng lặp. Định nghĩa đệ quy rất khó hiểu nhưng việc chuyển đổi vòng lặp thành đệ quy thì rất dễ dàng.

Elixir cung cấp cho chúng tôi Enum module. Mô-đun này được sử dụng cho các cuộc gọi lặp đi lặp lại nhiều nhất vì việc sử dụng chúng dễ dàng hơn nhiều so với việc cố gắng tìm ra các định nghĩa đệ quy cho giống nhau. Chúng ta sẽ thảo luận về những điều đó trong chương tiếp theo. Các định nghĩa đệ quy của riêng bạn chỉ nên được sử dụng khi bạn không tìm thấy giải pháp bằng cách sử dụng mô-đun đó. Các chức năng đó được tối ưu hóa cuộc gọi đuôi và khá nhanh.