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