Elixir - Chức năng
Hàm là một tập hợp các câu lệnh được tổ chức lại với nhau để thực hiện một nhiệm vụ cụ thể. Các hàm trong lập trình hoạt động hầu hết giống như hàm trong Toán học. Bạn cung cấp cho các hàm một số đầu vào, chúng tạo ra đầu ra dựa trên đầu vào được cung cấp.
Có 2 loại chức năng trong Elixir -
Chức năng ẩn danh
Các hàm được xác định bằng cách sử dụng fn..end constructlà các chức năng ẩn danh. Các hàm này đôi khi còn được gọi là lambdas. Chúng được sử dụng bằng cách gán chúng cho các tên biến.
Chức năng được đặt tên
Các hàm được xác định bằng cách sử dụng def keywordlà các hàm được đặt tên. Đây là các hàm gốc được cung cấp trong Elixir.
Chức năng ẩn danh
Đúng như tên của nó, một hàm ẩn danh không có tên. Chúng thường được chuyển cho các chức năng khác. Để xác định một hàm ẩn danh trong Elixir, chúng ta cầnfn và endtừ khóa. Trong số này, chúng ta có thể xác định bất kỳ số lượng tham số và thân hàm nào được phân tách bằng->. Ví dụ,
sum = fn (a, b) -> a + b end
IO.puts(sum.(1, 5))
Khi chạy chương trình trên, được chạy, nó tạo ra kết quả sau:
6
Lưu ý rằng các hàm này không được gọi giống như các hàm đã đặt tên. Chúng ta có một '.'giữa tên hàm và các đối số của nó.
Sử dụng Toán tử Chụp
Chúng ta cũng có thể xác định các chức năng này bằng toán tử chụp. Đây là một phương pháp dễ dàng hơn để tạo các hàm. Bây giờ chúng ta sẽ xác định hàm tổng ở trên bằng cách sử dụng toán tử bắt,
sum = &(&1 + &2)
IO.puts(sum.(1, 2))
Khi chương trình trên được chạy, nó tạo ra kết quả sau:
3
Trong phiên bản viết tắt, các tham số của chúng tôi không được đặt tên nhưng có sẵn cho chúng tôi dưới dạng & 1, & 2, & 3, v.v.
Chức năng đối sánh mẫu
Đối sánh mẫu không chỉ giới hạn ở các biến và cấu trúc dữ liệu. Chúng ta có thể sử dụng đối sánh mẫu để làm cho các hàm của chúng ta đa hình. Ví dụ: chúng ta sẽ khai báo một hàm có thể nhận 1 hoặc 2 đầu vào (trong một bộ tuple) và in chúng ra bảng điều khiển,
handle_result = fn
{var1} -> IO.puts("#{var1} found in a tuple!")
{var_2, var_3} -> IO.puts("#{var_2} and #{var_3} found!")
end
handle_result.({"Hey people"})
handle_result.({"Hello", "World"})
Khi chương trình trên được chạy, nó tạo ra kết quả sau:
Hey people found in a tuple!
Hello and World found!
Chức năng được đặt tên
Chúng ta có thể định nghĩa các hàm bằng tên để có thể dễ dàng tham khảo sau này. Các hàm được đặt tên được định nghĩa trong một mô-đun bằng cách sử dụng từ khóa def. Các chức năng được đặt tên luôn được xác định trong một mô-đun. Để gọi các hàm được đặt tên, chúng ta cần tham chiếu chúng bằng cách sử dụng tên mô-đun của chúng.
Sau đây là cú pháp cho các hàm được đặt tên:
def function_name(argument_1, argument_2) do
#code to be executed when function is called
end
Bây giờ chúng ta hãy xác định hàm tổng được đặt tên của chúng ta trong mô-đun Toán học.
defmodule Math do
def sum(a, b) do
a + b
end
end
IO.puts(Math.sum(5, 6))
Khi chạy chương trình trên, nó tạo ra kết quả sau:
11
Đối với các hàm 1-liner, có một ký hiệu viết tắt để xác định các hàm này, sử dụng do:. Ví dụ -
defmodule Math do
def sum(a, b), do: a + b
end
IO.puts(Math.sum(5, 6))
Khi chạy chương trình trên, nó tạo ra kết quả sau:
11
Chức năng riêng tư
Elixir cung cấp cho chúng ta khả năng xác định các chức năng riêng tư có thể được truy cập từ bên trong mô-đun mà chúng được định nghĩa. Để xác định một chức năng riêng tư, hãy sử dụngdefp thay vì def. Ví dụ,
defmodule Greeter do
def hello(name), do: phrase <> name
defp phrase, do: "Hello "
end
Greeter.hello("world")
Khi chương trình trên được chạy, nó tạo ra kết quả sau:
Hello world
Nhưng nếu chúng ta chỉ cố gắng gọi hàm cụm từ một cách rõ ràng, bằng cách sử dụng Greeter.phrase() chức năng, nó sẽ gây ra lỗi.
Đối số mặc định
Nếu chúng ta muốn một giá trị mặc định cho một đối số, chúng ta sử dụng argument \\ value cú pháp -
defmodule Greeter do
def hello(name, country \\ "en") do
phrase(country) <> name
end
defp phrase("en"), do: "Hello, "
defp phrase("es"), do: "Hola, "
end
Greeter.hello("Ayush", "en")
Greeter.hello("Ayush")
Greeter.hello("Ayush", "es")
Khi chương trình trên được chạy, nó tạo ra kết quả sau:
Hello, Ayush
Hello, Ayush
Hola, Ayush