Elixir - หน้าที่

ฟังก์ชันคือชุดของคำสั่งที่จัดระเบียบร่วมกันเพื่อทำงานเฉพาะ ฟังก์ชันในการเขียนโปรแกรมส่วนใหญ่เหมือนกับฟังก์ชันในคณิตศาสตร์ คุณให้ฟังก์ชั่นอินพุตบางอย่างพวกมันสร้างเอาต์พุตตามอินพุตที่ให้มา

มีฟังก์ชั่น 2 ประเภทใน Elixir -

ฟังก์ชันไม่ระบุชื่อ

ฟังก์ชันที่กำหนดโดยใช้ fn..end constructเป็นฟังก์ชันที่ไม่ระบุชื่อ ฟังก์ชันเหล่านี้บางครั้งเรียกว่า lambdas ใช้โดยกำหนดให้กับชื่อตัวแปร

ฟังก์ชันที่มีชื่อ

ฟังก์ชันที่กำหนดโดยใช้ def keywordเป็นชื่อฟังก์ชัน สิ่งเหล่านี้เป็นฟังก์ชันดั้งเดิมที่มีให้ใน Elixir

ฟังก์ชันที่ไม่ระบุตัวตน

เช่นเดียวกับชื่อที่แสดงถึงฟังก์ชันที่ไม่ระบุตัวตนจะไม่มีชื่อ สิ่งเหล่านี้มักถูกส่งผ่านไปยังฟังก์ชันอื่น ๆ ในการกำหนดฟังก์ชันนิรนามใน Elixir เราจำเป็นต้องมีfn และ endคำหลัก ภายในสิ่งเหล่านี้เราสามารถกำหนดพารามิเตอร์และส่วนของฟังก์ชันจำนวนเท่าใดก็ได้โดยคั่นด้วย->. ตัวอย่างเช่น,

sum = fn (a, b) -> a + b end
IO.puts(sum.(1, 5))

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

6

โปรดทราบว่าฟังก์ชันเหล่านี้ไม่ได้ถูกเรียกเหมือนฟังก์ชันที่มีชื่อ เรามี '.'ระหว่างชื่อฟังก์ชันและอาร์กิวเมนต์

การใช้ตัวดำเนินการจับภาพ

เรายังสามารถกำหนดฟังก์ชันเหล่านี้โดยใช้ตัวดำเนินการจับภาพ นี่เป็นวิธีที่ง่ายกว่าในการสร้างฟังก์ชัน ตอนนี้เราจะกำหนดฟังก์ชัน sum ข้างต้นโดยใช้ตัวดำเนินการจับภาพ

sum = &(&1 + &2) 
IO.puts(sum.(1, 2))

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

3

ในเวอร์ชันจดชวเลขพารามิเตอร์ของเราไม่ได้รับการตั้งชื่อ แต่มีให้เราเป็น & 1, & 2, & 3 เป็นต้น

ฟังก์ชันการจับคู่รูปแบบ

การจับคู่รูปแบบไม่ได้ จำกัด เฉพาะตัวแปรและโครงสร้างข้อมูลเท่านั้น เราสามารถใช้การจับคู่รูปแบบเพื่อทำให้ฟังก์ชันของเรามีความหลากหลาย ตัวอย่างเช่นเราจะประกาศฟังก์ชันที่สามารถรับอินพุต 1 หรือ 2 อินพุต (ภายในทูเพิล) และพิมพ์ลงในคอนโซล

handle_result = fn
   {var1} -> IO.puts("#{var1} found in a tuple!")
   {var_2, var_3} -> IO.puts("#{var_2} and #{var_3} found!")
end
handle_result.({"Hey people"})
handle_result.({"Hello", "World"})

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

Hey people found in a tuple!
Hello and World found!

ฟังก์ชันที่มีชื่อ

เราสามารถกำหนดฟังก์ชันด้วยชื่อเพื่อให้อ้างอิงได้ง่ายในภายหลัง ฟังก์ชันที่กำหนดชื่อถูกกำหนดภายในโมดูลโดยใช้คำสำคัญ def ฟังก์ชันที่กำหนดชื่อจะถูกกำหนดไว้ในโมดูลเสมอ ในการเรียกใช้ฟังก์ชันที่มีชื่อเราจำเป็นต้องอ้างอิงโดยใช้ชื่อโมดูล

ต่อไปนี้เป็นไวยากรณ์สำหรับฟังก์ชันที่มีชื่อ -

def function_name(argument_1, argument_2) do
   #code to be executed when function is called
end

ตอนนี้ให้เรากำหนดผลรวมฟังก์ชันที่มีชื่อของเราภายในโมดูลคณิตศาสตร์

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

IO.puts(Math.sum(5, 6))

เมื่อรันโปรแกรมด้านบนจะให้ผลลัพธ์ดังนี้ -

11

สำหรับฟังก์ชั่น 1 ซับมีสัญกรณ์ชวเลขเพื่อกำหนดฟังก์ชันเหล่านี้โดยใช้ do:. ตัวอย่างเช่น -

defmodule Math do
   def sum(a, b), do: a + b
end
IO.puts(Math.sum(5, 6))

เมื่อรันโปรแกรมด้านบนจะให้ผลลัพธ์ดังนี้ -

11

ฟังก์ชั่นส่วนตัว

Elixir ช่วยให้เราสามารถกำหนดฟังก์ชันส่วนตัวที่สามารถเข้าถึงได้จากภายในโมดูลที่กำหนดไว้ ในการกำหนดฟังก์ชันส่วนตัวให้ใช้defp แทน def. ตัวอย่างเช่น,

defmodule Greeter do
   def hello(name), do: phrase <> name
   defp phrase, do: "Hello "
end

Greeter.hello("world")

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

Hello world

แต่ถ้าเราพยายามเรียกใช้ฟังก์ชันวลีอย่างชัดเจนโดยใช้ Greeter.phrase() มันจะเพิ่มข้อผิดพลาด

อาร์กิวเมนต์เริ่มต้น

หากเราต้องการค่าเริ่มต้นสำหรับอาร์กิวเมนต์เราใช้ argument \\ value ไวยากรณ์ -

defmodule Greeter do
   def hello(name, country \\ "en") do
      phrase(country) <> name
   end

   defp phrase("en"), do: "Hello, "
   defp phrase("es"), do: "Hola, "
end

Greeter.hello("Ayush", "en")
Greeter.hello("Ayush")
Greeter.hello("Ayush", "es")

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

Hello, Ayush
Hello, Ayush
Hola, Ayush