Elixir - Toàn diện
Danh sách hiểu là đường cú pháp để lặp qua các bảng liệt kê trong Elixir. Trong chương này, chúng ta sẽ sử dụng các cách hiểu để lặp lại và tạo.
Khái niệm cơ bản
Khi chúng tôi xem xét mô-đun Enum trong chương liệt kê, chúng tôi đã bắt gặp hàm bản đồ.
Enum.map(1..3, &(&1 * 2))
Trong ví dụ này, chúng ta sẽ chuyển một hàm làm đối số thứ hai. Mỗi mục trong phạm vi sẽ được chuyển vào hàm và sau đó một danh sách mới sẽ được trả về chứa các giá trị mới.
Ánh xạ, lọc và chuyển đổi là những hành động rất phổ biến trong Elixir và do đó, có một cách hơi khác để đạt được kết quả giống như ví dụ trước -
for n <- 1..3, do: n * 2
Khi chúng tôi chạy đoạn mã trên, nó tạo ra kết quả sau:
[2, 4, 6]
Ví dụ thứ hai là khả năng hiểu và như bạn có thể thấy, nó chỉ đơn giản là đường cú pháp cho những gì bạn cũng có thể đạt được nếu bạn sử dụng Enum.mapchức năng. Tuy nhiên, không có lợi ích thực sự nào khi sử dụng khả năng hiểu một hàm từ mô-đun Enum về mặt hiệu suất.
Tổng hợp không giới hạn trong danh sách nhưng có thể được sử dụng với tất cả các kiểu liệt kê.
Bộ lọc
Bạn có thể coi các bộ lọc như một loại bảo vệ để hiểu rõ. Khi một giá trị được lọc trả vềfalse hoặc là nilnó bị loại khỏi danh sách cuối cùng. Hãy để chúng tôi lặp lại trên một phạm vi và chỉ lo lắng về số chẵn. Chúng tôi sẽ sử dụngis_even từ mô-đun Integer để kiểm tra xem một giá trị có chẵn hay không.
import Integer
IO.puts(for x <- 1..10, is_even(x), do: x)
Khi đoạn mã trên được chạy, nó tạo ra kết quả sau:
[2, 4, 6, 8, 10]
Chúng tôi cũng có thể sử dụng nhiều bộ lọc trong cùng một cách hiểu. Thêm một bộ lọc khác mà bạn muốn sauis_even bộ lọc được phân tách bằng dấu phẩy.
: vào Option
Trong các ví dụ trên, tất cả các từ hiểu được trả về danh sách là kết quả của chúng. Tuy nhiên, kết quả của việc hiểu có thể được chèn vào các cấu trúc dữ liệu khác nhau bằng cách chuyển:into tùy chọn để hiểu.
Ví dụ, một bitstring Trình tạo có thể được sử dụng với tùy chọn: into để dễ dàng loại bỏ tất cả các khoảng trắng trong một chuỗi -
IO.puts(for <<c <- " hello world ">>, c != ?\s, into: "", do: <<c>>)
Khi đoạn mã trên được chạy, nó tạo ra kết quả sau:
helloworld
Đoạn mã trên xóa tất cả các khoảng trắng khỏi chuỗi bằng cách sử dụng c != ?\s lọc và sau đó sử dụng tùy chọn: into, nó đặt tất cả các ký tự được trả về trong một chuỗi.