- ตัวแปรใช้เก็บค่าพื้นฐานใน Erlang
- ขึ้นต้นด้วยตัวพิมพ์ใหญ่ ตามด้วยตัวพิมพ์ใหญ่หรือเล็ก ตัวเลข และขีดล่าง (_ underscore) โดยไม่มีอักษรพิเศษอื่นๆ
A_Long_Variable_Name
Vname
T2animation
Db2Connect
- ตัวแปรเมื่อมีการผูกค่าแล้ว เปลี่ยนแปลงค่าไม่ได้ (single assignment)
- ถ้าต้องการประมวลผลลัพธ์จากตัวแปร ต้องสร้างตัวแปรใหม่มาเก็บผลลัพธ์
Result = Ten*Ten.
- การเรียกตัวแปรใน Erlang เป็นแบบ Call by value
- อากิวเมนต์ที่จะผ่านเข้าสู่ฟังก์ชั่น จะต้องมีการผูกค่า ก่อนที่ฟังก์ชั่นจะทำการประมวลผล
- ใน Erlang ไม่มีการเรียกแบบอ้างอิง Call by reference does not exist
- ตัวแปรเป็นแบบ local อยู่กับฟังก์ชั่นที่มันอยู่
- ไม่มีตัวแปรแบบ Global ใน Erlang
- ตัวแปรไม่ต้องประกาศก่อน ใช้เมื่อต้องการใช้มัน
- ตัวแปรใน Erlang เป็นแบบ dynamic type system (Erlang type system)
- ตัวแปรที่ถูกค่าแล้วสามารถยกเลิกการผูกค่าโดยใช้ฟังก์ชั่น f() มีรูปแบบคือ f(Variable).
Complex data structures
การสร้างโครงสร้างข้อมูลที่ซับซ้อนใน Erlang เราจะใช้ list และ tuple ร่วมกัน
ตัวอย่าง
[{person,"Fox","Fury",
[{age,26},
{pet,{cat,redy},{dog,daisy}}]
},
{person,"devil","mangi",
[{age,27},
{pet,{fish,goldy},{bird,finale}}]
}]
หรือเขียนแยกแล้วนำมาประกอบกัน
FoxAttList = [{age,26},{pets,{cat,redy},{dog,daisy}}].
FoxTuple = {person,"Fox","Fury",FoxAttList}.
Pattern Matching
การทำจับคู่รูปแบบใน Erlang นั้นกระทำเพื่อ
- จับคู่เพื่อผูกค่าให้ตัวแปร
- ควบคุมโฟลการทำงานโปรแกรม
- แยกข้อมูลที่ผสมกันอยู่
รูปแบบการใช้
Pattern = Expression
โดยที่
Pattern นั้นประกอบด้วยโครงสร้างข้อมูล ซึ่งเป็นได้ทั้ง
- ตัวแปรที่ถูกผูกค่าไว้แล้ว หรือตัวแปรที่ยังไม่ได้ผูกค่า
- ค่าตามตัว (atom,integer,string)
- ตัวแปรถูกผูกค่า
- การดำเนินการทางคณิตศาสตร์
- การเรียกฟังก์ชั่น
- ไม่มีตัวแปรที่ไม่ถูกผูกค่า
- จับคู่สำเร็จ
- จับคู่ไม่สำเร็จ
เงื่อนไขการจะจับคู่ให้สำเร็จ
- expression กับ pattern มีรูปแบบเดียวกัน
- ค่าตามตัว ใน pattern มีค่าเท่ากัน ตรงตำแหน่งกับใน expression
- ตัวแปรที่ไม่ได้ผูกค่า จะถูกผูกค่ากับผลลัพธ์ที่ได้จาก expression
- ตัวแปรที่ถูกผูกค่า ต้องมีค่าเดียวกับค่าที่ได้จาก expression
ตัวอย่าง
Sum = 1+8.
นิพจน์ 1+8 ถูกคำนวณ ผลลัพธ์จับคู่กับตัวแปร Sum ถ้าตัวแปรยังไม่ถูกผูกค่า Sum จะถูกผูกค่ากับผลลัพธ์ที่ได้จากการคำนวณ กระบวนการจับคู่สำเร็จ
ในกรณีที่ Sum มีการผูกค่าไว้ก่อนแล้ว การจับคู่จะสำเร็จได้ ถ้า Sum ได้ถูกผูกค่ากับ 9 ไว้ก่อนแล้ว
ตัวอย่างการจับคู่
1> Sum = 1+8.
9
2> Sum = 10.
** exception error: no match of right hand side value 10
3> Sum = 9.
9
4>
ตัวอย่างการจับคู่ของลิสต์
1> List = [1,2,3,4]. ผูกค่าตัวแปร List
[1,2,3,4]
2> [Head|Tail] = List. ผูกค่าตาม Pattern
[1,2,3,4]
3> Head.
1
4> Tail.
[2,3,4]
5> [Head|Tail] = [1]. จับคู่ไม่ได้ ค่าไม่เหมือนกัน
** exception error: no match of right hand side value [1]
6> [Head|Tail] = [1,2,3,4].
[1,2,3,4]
7> [Head1|Tail1] = [1].
[1]
8> Head1.
1
9> Tail1.
[]
10> List = [Head1|Tail]. จับคู่ได้ มีรูปแบบตรงกันและค่าภายในตรงกัน
[1,2,3,4]
11>
ตัวอย่างการจับคู่ของทูเพิล
1> {Element,Element,X,Y} = {1,1,2,3}.
{1,1,2,3}
2> Element.
1
3> X.
2
4> Y.
3
5> {Element,Element,X,Y} = {1,2,2,3}.
** exception error: no match of right hand side value {1,2,2,3}
6> {Element,_,X,Y} = {1,2,2,3}.
{1,2,2,3}
7> {person,Name,LastName} = {person,"Devil","Mangi"}.
{person,"Devil","Mangi"}
8>
ในกรณีที่เราไม่ต้องการผูกค่าที่ตำแหน่งใดๆ เราสามารถใช้เครื่องหมายขีดล่าง (_) แทนตรงตำแหน่งนั้น ซึ่งเป็นการทำ wildcard นั่นเอง
สรุปคร่าวๆเกี่ยวกับการจับคู่ใน Erlang
กรณีที่ 1
X = [1,2,3].
X ไม่เคยผูกค่ามาก่อน จะถูกผูกค่ากับค่าทางด้านซ้ายมือ
กรณีที่ 2
X = [1,2,3].
X ถูกผูกค่ามาก่อนแล้ว จะทำการเปรียบเทียบเพื่อจับคู่ มีผลลัพธ์เกิดได้ก็คือ จับคู่สำเร็จ และไม่สำเร็จ
กรณีที่ 3
X = [0]++[1,2,3].
X ถูกผูกค่ามาก่อนแล้ว ทำการประมวลนิพจน์ด้านซ้ายมือ แล้วทำการเปรียบเทียบเพื่อจับคู่ มีผลลัพธ์เกิดได้ก็คือ จับคู่สำเร็จ และไม่สำเร็จ
ตัวอย่างการจับคู่ และผลลัพธ์ที่ได้
กรณีจับคู่ไม่สำเร็จ
{A,A,B} = {abc,def,123}.
ขนาดทูเปิลเท่ากัน A ผูกกับอะตอม abc แต่เมื่อ A ได้ผูกกับ abc แล้วเมื่อนำมาจับคู่กับ def ส่งผลให้เกิดข้อผิดพลาดขึ้น
[A,B,C,D] = [1,2,3].
จับคู่ไม่ได้เพราะจำนวน element ในลิสมีไม่เท่ากัน
กรณีจับคู่สำเร็จ
[A,B,C|D] = [1,2,3].
จับคู่ได้เพราะจำนวน element ในลิสมีเท่ากัน โดย D ถูกผูกกับลิสว่าง []
[A,B|C] = [1,2,3,4,5,6].
A จับคู่กับ 1 และ B จับกับ 2 สุดท้าย C จับคู่กับลิสที่เหลือ [3,4,5,6]
การจับคู่เพื่อแยกค่าจากข้อมูลที่ผสมกันอยู่
{A,_,[B|_],{B}} = {abc,23,[22,23],{22}}.
A จับคู่กับ abc และ B จับคู่กับ 22 โดยใช้การทำ Wildcard เพื่อยกเว้นค่าที่ไม่ต้องการจับคู่
ไม่มีความคิดเห็น:
แสดงความคิดเห็น