Elixir - ประเภท
Elixir เป็นภาษาที่พิมพ์แบบไดนามิกดังนั้นทุกประเภทใน Elixir จะอนุมานโดยรันไทม์ อย่างไรก็ตาม Elixir มาพร้อมกับ typespecs ซึ่งเป็นสัญกรณ์ที่ใช้สำหรับdeclaring custom data types and declaring typed function signatures (specifications).
ข้อมูลจำเพาะของฟังก์ชัน (รายละเอียด)
โดยค่าเริ่มต้น Elixir จะมีประเภทพื้นฐานบางประเภทเช่นจำนวนเต็มหรือ pid และประเภทที่ซับซ้อนเช่น roundฟังก์ชันที่ปัดเศษทศนิยมให้เป็นจำนวนเต็มที่ใกล้เคียงที่สุดรับตัวเลขเป็นอาร์กิวเมนต์ (จำนวนเต็มหรือจำนวนทศนิยม) และส่งกลับจำนวนเต็ม ในเอกสารที่เกี่ยวข้องลายเซ็นที่พิมพ์รอบเขียนเป็น -
round(number) :: integer
คำอธิบายข้างต้นหมายความว่าฟังก์ชันทางด้านซ้ายใช้เป็นอาร์กิวเมนต์ที่ระบุไว้ในวงเล็บและส่งกลับสิ่งที่อยู่ทางขวาของ :: นั่นคือจำนวนเต็ม รายละเอียดฟังก์ชันเขียนด้วย@specคำสั่งวางไว้หน้านิยามฟังก์ชัน ฟังก์ชันรอบสามารถเขียนเป็น -
@spec round(number) :: integer
def round(number), do: # Function implementation
...
typespecs รองรับประเภทที่ซับซ้อนเช่นกันตัวอย่างเช่นหากคุณต้องการส่งคืนรายการจำนวนเต็มคุณสามารถใช้ [Integer]
ประเภทที่กำหนดเอง
แม้ว่า Elixir จะมีประเภทในตัวที่มีประโยชน์มากมาย แต่ก็สะดวกในการกำหนดประเภทที่กำหนดเองตามความเหมาะสม ซึ่งสามารถทำได้เมื่อกำหนดโมดูลผ่านคำสั่ง @type ให้เราพิจารณาตัวอย่างเพื่อให้เข้าใจตรงกัน -
defmodule FunnyCalculator do
@type number_with_joke :: {number, String.t}
@spec add(number, number) :: number_with_joke
def add(x, y), do: {x + y, "You need a calculator to do that?"}
@spec multiply(number, number) :: number_with_joke
def multiply(x, y), do: {x * y, "It is like addition on steroids."}
end
{result, comment} = FunnyCalculator.add(10, 20)
IO.puts(result)
IO.puts(comment)
เมื่อรันโปรแกรมข้างต้นจะให้ผลลัพธ์ดังนี้ -
30
You need a calculator to do that?
NOTE - ประเภทที่กำหนดเองที่กำหนดผ่าน @type จะถูกส่งออกและพร้อมใช้งานภายนอกโมดูลที่กำหนดไว้หากคุณต้องการเก็บประเภทที่กำหนดเองไว้เป็นส่วนตัวคุณสามารถใช้ @typep คำสั่งแทน @type.