Elixir - โปรโตคอล
โปรโตคอลเป็นกลไกในการบรรลุความหลากหลายใน Elixir การส่งโพรโทคอลสามารถใช้ได้กับข้อมูลทุกประเภทตราบเท่าที่มันใช้โปรโตคอล
ให้เราพิจารณาตัวอย่างของการใช้โปรโตคอล เราใช้ฟังก์ชันที่เรียกว่าto_stringในบทก่อนหน้าเพื่อแปลงจากประเภทอื่นเป็นประเภทสตริง นี่เป็นโปรโตคอลจริงๆ มันทำหน้าที่ตามอินพุตที่ระบุโดยไม่เกิดข้อผิดพลาด สิ่งนี้อาจดูเหมือนว่าเรากำลังพูดถึงฟังก์ชันการจับคู่รูปแบบ แต่เมื่อเราดำเนินการต่อไปมันกลับกลายเป็นว่าต่างออกไป
พิจารณาตัวอย่างต่อไปนี้เพื่อทำความเข้าใจกลไกโปรโตคอลเพิ่มเติม
ให้เราสร้างโปรโตคอลที่จะแสดงว่าอินพุตที่ระบุว่างเปล่าหรือไม่ เราจะเรียกโปรโตคอลนี้ว่าblank?.
การกำหนดโปรโตคอล
เราสามารถกำหนดโปรโตคอลใน Elixir ได้ด้วยวิธีต่อไปนี้ -
defprotocol Blank do
def blank?(data)
end
อย่างที่คุณเห็นเราไม่จำเป็นต้องกำหนดเนื้อความสำหรับฟังก์ชัน หากคุณคุ้นเคยกับอินเทอร์เฟซในภาษาโปรแกรมอื่น ๆ คุณสามารถคิดว่า Protocol เป็นสิ่งเดียวกัน
ดังนั้นพิธีสารนี้จึงบอกว่าสิ่งใดก็ตามที่ใช้ต้องมี empty?แม้ว่ามันจะขึ้นอยู่กับตัวดำเนินการว่าฟังก์ชันตอบสนองอย่างไร เมื่อกำหนดโปรโตคอลแล้วให้เราเข้าใจวิธีเพิ่มการใช้งานสองสามอย่าง
การดำเนินการตามพิธีสาร
เนื่องจากเราได้กำหนดโปรโตคอลตอนนี้เราจึงต้องบอกวิธีจัดการกับอินพุตต่างๆที่อาจได้รับ ให้เราสร้างตัวอย่างที่เราได้ทำก่อนหน้านี้ เราจะใช้โปรโตคอลเปล่าสำหรับรายการแผนที่และสตริง สิ่งนี้จะแสดงว่าสิ่งที่เราผ่านมานั้นว่างเปล่าหรือไม่
#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")
คุณสามารถใช้โปรโตคอลของคุณได้มากหรือน้อยตามที่คุณต้องการสิ่งที่เหมาะสมสำหรับการใช้งานโปรโตคอลของคุณ นี่เป็นกรณีการใช้งานขั้นพื้นฐานของโปรโตคอล เมื่อรันโปรแกรมข้างต้นจะให้ผลลัพธ์ดังนี้ -
true
false
true
false
Note - หากคุณใช้สิ่งนี้กับประเภทอื่น ๆ นอกเหนือจากที่คุณกำหนดโปรโตคอลไว้จะทำให้เกิดข้อผิดพลาด