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 - หากคุณใช้สิ่งนี้กับประเภทอื่น ๆ นอกเหนือจากที่คุณกำหนดโปรโตคอลไว้จะทำให้เกิดข้อผิดพลาด