Elixir - โมดูล

ใน Elixir เราจัดกลุ่มฟังก์ชันต่างๆเป็นโมดูล เราได้ใช้โมดูลต่างๆในบทก่อนหน้าแล้วเช่นโมดูล String, โมดูล Bitwise, โมดูล Tuple เป็นต้น

ในการสร้างโมดูลของเราเองใน Elixir เราใช้ไฟล์ defmoduleมาโคร เราใช้ไฟล์def มาโครเพื่อกำหนดฟังก์ชันในโมดูลนั้น -

defmodule Math do
   def sum(a, b) do
      a + b
   end
end

ในส่วนต่อไปนี้ตัวอย่างของเราจะมีขนาดที่ยาวขึ้นและการพิมพ์ทั้งหมดในเชลล์อาจเป็นเรื่องยาก เราจำเป็นต้องเรียนรู้วิธีการคอมไพล์โค้ด Elixir และวิธีเรียกใช้สคริปต์ Elixir

การรวบรวม

สะดวกในการเขียนโมดูลลงในไฟล์เพื่อให้สามารถคอมไพล์และนำกลับมาใช้ใหม่ได้ สมมติว่าเรามีไฟล์ชื่อ math.ex ที่มีเนื้อหาดังต่อไปนี้ -

defmodule Math do
   def sum(a, b) do
      a + b
   end
end

เราสามารถรวบรวมไฟล์โดยใช้คำสั่ง -elixirc :

$ elixirc math.ex

สิ่งนี้จะสร้างไฟล์ชื่อ Elixir.Math.beamมี bytecode สำหรับโมดูลที่กำหนด ถ้าเราเริ่มiexอีกครั้งคำจำกัดความโมดูลของเราจะพร้อมใช้งาน (โดยมีเงื่อนไขว่า iex เริ่มต้นในไดเร็กทอรีเดียวกันกับไฟล์ bytecode) ตัวอย่างเช่น,

IO.puts(Math.sum(1, 2))

โปรแกรมข้างต้นจะสร้างผลลัพธ์ดังต่อไปนี้ -

3

โหมดสคริปต์

นอกเหนือจากนามสกุลไฟล์ Elixir .ex, Elixir ยังรองรับ .exsไฟล์สำหรับการเขียนสคริปต์ Elixir ปฏิบัติต่อทั้งสองไฟล์ในลักษณะเดียวกันข้อแตกต่างเพียงประการเดียวคือวัตถุประสงค์.ex ไฟล์มีไว้เพื่อคอมไพล์ในขณะที่ใช้ไฟล์. exs สำหรับ scripting. เมื่อดำเนินการส่วนขยายทั้งสองจะรวบรวมและโหลดโมดูลลงในหน่วยความจำแม้ว่าจะมีเพียง.ex ไฟล์เขียน bytecode ไปยังดิสก์ในรูปแบบของไฟล์. beam

ตัวอย่างเช่นหากเราต้องการเรียกใช้ไฟล์ Math.sum ในไฟล์เดียวกันเราสามารถใช้. exs ได้ดังต่อไปนี้ -

Math.exs

defmodule Math do
   def sum(a, b) do
      a + b
   end
end
IO.puts(Math.sum(1, 2))

เราสามารถเรียกใช้โดยใช้คำสั่ง Elixir -

$ elixir math.exs

โปรแกรมข้างต้นจะสร้างผลลัพธ์ดังต่อไปนี้ -

3

ไฟล์จะถูกคอมไพล์ในหน่วยความจำและดำเนินการโดยพิมพ์“ 3” ออกมา จะไม่มีการสร้างไฟล์ bytecode

โมดูลการทำรัง

โมดูลสามารถซ้อนกันได้ใน Elixir คุณลักษณะของภาษานี้ช่วยให้เราจัดระเบียบรหัสของเราได้ดีขึ้น ในการสร้างโมดูลที่ซ้อนกันเราใช้ไวยากรณ์ต่อไปนี้ -

defmodule Foo do
   #Foo module code here
   defmodule Bar do
      #Bar module code here
   end
end

ตัวอย่างที่ให้ไว้ข้างต้นจะกำหนดสองโมดูล: Foo และ Foo.Bar. ที่สองสามารถเข้าถึงได้ในรูปแบบBar ข้างใน Fooตราบเท่าที่อยู่ในขอบเขตคำศัพท์เดียวกัน หากในภายหลังไฟล์Bar โมดูลถูกย้ายออกนอกนิยามโมดูล Foo ต้องอ้างอิงด้วยชื่อเต็ม (Foo.Bar) หรือนามแฝงต้องตั้งค่าโดยใช้คำสั่งนามแฝงที่กล่าวถึงในบทนามแฝง

Note- ใน Elixir ไม่จำเป็นต้องกำหนดโมดูล Foo เพื่อกำหนดโมดูล Foo.Bar เนื่องจากภาษาจะแปลชื่อโมดูลทั้งหมดเป็นอะตอม คุณสามารถกำหนดโมดูลที่ถูกควบคุมโดยพลการโดยไม่ต้องกำหนดโมดูลใด ๆ ในห่วงโซ่ ตัวอย่างเช่นคุณสามารถกำหนดFoo.Bar.Baz โดยไม่ต้องกำหนด Foo หรือ Foo.Bar.