Elixir - Giao thức

Các giao thức là một cơ chế để đạt được tính đa hình trong Elixir. Điều phối trên một giao thức có sẵn cho bất kỳ loại dữ liệu nào miễn là nó thực hiện giao thức.

Chúng ta hãy xem xét một ví dụ về việc sử dụng các giao thức. Chúng tôi đã sử dụng một hàm có tên làto_stringtrong các chương trước để chuyển đổi từ kiểu khác sang kiểu chuỗi. Đây thực sự là một giao thức. Nó hoạt động theo đầu vào được đưa ra mà không tạo ra lỗi. Điều này có vẻ như chúng ta đang thảo luận về các chức năng so khớp mẫu, nhưng khi chúng ta tiến xa hơn, nó lại khác.

Hãy xem xét ví dụ sau để hiểu thêm về cơ chế giao thức.

Hãy để chúng tôi tạo một giao thức sẽ hiển thị nếu đầu vào đã cho trống hoặc không. Chúng tôi sẽ gọi giao thức nàyblank?.

Xác định một giao thức

Chúng ta có thể xác định một giao thức trong Elixir theo cách sau:

defprotocol Blank do
   def blank?(data)
end

Như bạn thấy, chúng ta không cần xác định một phần thân cho hàm. Nếu bạn đã quen thuộc với các giao diện trong các ngôn ngữ lập trình khác, bạn có thể nghĩ về một Giao thức về cơ bản giống như một thứ.

Vì vậy, Nghị định thư này nói rằng bất kỳ thứ gì triển khai nó phải có empty?chức năng, mặc dù nó tùy thuộc vào người triển khai về cách chức năng phản hồi. Với giao thức được xác định, hãy để chúng tôi hiểu cách thêm một số triển khai.

Thực hiện một giao thức

Vì chúng ta đã xác định một giao thức, nên bây giờ chúng ta cần cho nó biết cách xử lý các đầu vào khác nhau mà nó có thể nhận được. Hãy để chúng tôi xây dựng trên ví dụ mà chúng tôi đã thực hiện trước đó. Chúng tôi sẽ triển khai giao thức trống cho danh sách, bản đồ và chuỗi. Điều này sẽ hiển thị nếu thứ chúng tôi đã thông qua là trống hay không.

#Defining the protocol
defprotocol Blank do
   def blank?(data)
end

#Implementing the protocol for lists
defimpl Blank, for: List do
   def blank?([]), do: true
   def blank?(_), do: false
end

#Implementing the protocol for strings
defimpl Blank, for: BitString do
   def blank?(""), do: true
   def blank?(_), do: false
end

#Implementing the protocol for maps
defimpl Blank, for: Map do
   def blank?(map), do: map_size(map) == 0
end

IO.puts(Blank.blank? [])
IO.puts(Blank.blank? [:true, "Hello"])
IO.puts(Blank.blank? "")
IO.puts(Blank.blank? "Hi")

Bạn có thể triển khai Giao thức của mình cho nhiều hoặc ít loại tùy thích, bất cứ điều gì có ý nghĩa đối với việc sử dụng Giao thức của bạn. Đây là một trường hợp sử dụng khá cơ bản của các giao thức. Khi chương trình trên được chạy, nó tạo ra kết quả sau:

true
false
true
false

Note - Nếu bạn sử dụng điều này cho bất kỳ kiểu nào khác với những kiểu bạn đã xác định giao thức, nó sẽ tạo ra lỗi.