Atoms and Strings
ความแตกต่างของ Atoms และ Strings
- atom ทำการประมวลผลได้เฉพาะนำมาเปรียบเทียบกันเอง
- string ประมวลผลได้หลายแบบ เช่นการนำสตริงมาแยก
ตัวอย่าง
สตริง "Hello World" สามารถแยกได้เป็น ["Hello","World"] แต่ในกรณีของอะตอม 'Hello World' ไม่สามารถแยกได้
- เราสามารถใช้สตริงแทนอะตอมในรูปแบบของตัวแปรคงที่แต่ ประสิทธิภาพที่ได้มีความแตกต่างกัน เพราะว่า
สตริง ใช้พื้นที่เก็บเท่ากับความยาวของข้อความ
อะตอม ใช้พื้นที่เก็บขนาด 2 ไบต์ในการอ้างอิง
ถ้ามีการเปรียบเทียบ สตริงต้องวิ่งเปรียบเทียบทีละตัวอักษร ส่วนอะตอมเปรียบเทียบในขั้นตอนเดียว
Building and Processing Lists
- เราสามารถแยก list ได้ออกเป็นส่วนหัว (head) และหาง (tail) ตราบเท่าที่ลิสต์ไม่ว่า
- หัวคือส่วนแรกในลิสต์ หางคือลิสต์ที่ภายในประกอบด้วยส่วนที่เหลือ
รูปแบบ
List = [Element|List] หรือ []
ลิสต์แบบ recursive
หัว หาง เขียนได้เป็น
[1,2,3] 1 [2,3] [1|[2,3]
[1,2,3] 1 [2|[3]] [1|[2|[3]]]
[1,2,3] 1 [2|[3|[]]] [1|[2|[3|[]]]]
[1,2|[3|[]]]
[1,2|[3]]
List Function and Operations
List เป็นชนิดข้อมูลที่มีประโยชน์มากที่ต้องใช้ใน Erlang โดยเฉพาะ เมื่อนำมาใช้งานร่วมกันกับ Tuple เพื่อใช้แทนโครงสร้างข้อมูลที่ซับซ้อน
การดำเนินการหลายๆอย่างเกี่ยวกับลิสต์ถูกกำหนดไว้ใน Module ชื่อ lists การเรียกใช้งานฟังก์ชั่นทำได้โดยมีรูปแบบดังนี้
ชื่อโมดูล:ชื่อฟังก์ชั่น(พารามิเตอร์).
ตัวอย่างฟังก์ชั่นที่ทำงานกับลิสต์
lists:max([1,2,3]).
lists:reverse([1,2,3]).
lists:sort([1,2,3]).
lists:split(2,[3,4,10,7,9]). ผลลัพธ์ {[3,4],[10,7,9]}
lists:sum([1,2,3,4,5]).
lists:zip([1,2,3],[9,8,7]). ผลลัพธ์ [{1,9},{2,8},{3,7}]
lists:delete(2,[1,2,3,4]). ผลลัพธ์ [1,3,4]
lists:last([1,2,3]).
lists:member(5,[1,23]). ผลลัพธ์ false
lists:member(23,[1,23]). ผลลัพธ์ true
lists:nth(2,[1,25,50,75]). ผลลัพธ์ 25
length([1,2,3]). ผลลัพธ์ 3
สำหรับลิสต์ส่วนประกอบภายในลิสต์สามารถเป็นข้อมูลได้หลายชนิด ตัวอย่าง
[a,mixed,"list",{with,4},'data types'].
การใช้ ++,--
- Right-associative ทำจากขวาไปซ้าย
- ++ ใช้รวม list สองอันเข้าด้วยกัน เช่น [1,2,3] ++ [7,8,9].
- -- นำแต่ละส่วนใน list ด้านขวาที่มีค่าตรง ลบจาก list ด้านซ้าย ถ้ามีส่วนใดๆ ด้านขวาไม่ตรงกับด้านซ้ายไม่สนใจ
ตัวอย่าง
[1,1] -- [1]. ผลลัพธ์ [1]
[1,2,3,4] -- [1,4]. ผลลัพธ์ [2,3]
[1,2] -- [1,1,3]. ผลลัพธ์ [2]
[1,2,3] -- [3]
[1,2]
([1,2,3] -- [1,3]) -- [1,2]. ทำในวงเล็บก่อน
[2] -- [1,2]
[]
กรณีของสตริง
"Hello " "Erlang " "World".
ผลลัพธ์
"Hello Erlang World"
ในการเพิ่ม element ลงในลิสต์ทำได้สองแบบ
- โดยตรง […|…] *มีประสิทธิภาพดี
เช่น [1|[2,3]]
- ใช้ ++ *ประสิทธิภาพด้อย
เช่น [1] ++ [2,3]
นอกจากนั้น Erlang ยังยอมรับการใช้แบบ nonflat strings
["Hello ",["Erlang "]|"World"].
["Hello ",["Erlang "],87,111,114,108,100].
การนำนิพจน์มาเปรียบเทียบกันผลลัพธ์ที่ได้ Boolean atoms คือ true หรือ false
เครื่องหมายเท่ากัน (==) ไม่เท่ากัน (/=) เปรียบเทียบโดยไม่คำนึงถึงชนิดข้อมูล
1 == one. ผลลัพธ์ false
one == one. ผลลัพธ์ true
ตัวเลขจะเปลี่ยนเป็นทศนิยมก่อนเปรียบเทียบ
1 == 1.0. ผลลัพธ์ true
1 /= 1.0. ผลลัพธ์ false
ถ้าจะเปรียบเทียบว่านิพจน์ทั้งสองเท่ากันที่ไม่จริงๆ ไม่มีการแปลง
1 =:= 1.0. ผลลัพธ์ false
1 =/= 1. ผลลัพธ์ false
ตัวดำเนินการเปรียบเทียบแบบต่างๆ
== equal to
/= not equal to
=:= exactly equal to
=/= exactly not equal to
=< less than or equal to
< less than
>= greater than or equal to
> greater than
ในกรณีที่นิพจน์ที่นำมาเปรียบเทียบมีหลายชนิด จะมีลำดับดังนี้
number<atom<reference<function<port<pid<tuple<list<binary
ตัวอย่างคือ ตัวเลขน้อยกว่าอะตอม ทูเพิลน้อยกว่าลิส
11 < ten. ผลลัพธ์ true
{1,2}<[]. ผลลัพธ์ true
การเปรียบเทียบระหว่าง List
สำหรับ list มีการเรียงลำดับตามตัวอักษร ในการเปรียบเทียบ โดยนำส่วนแรกในลิสต์นำมาเปรียบเทียบกัน อันไหนน้อยกว่า ลิสต์นั้นจะเป็นลิสต์ที่มีค่าเล็กกว่า
แต่ถ้าส่วนแรกเหมือนกัน ส่วนที่สองในลิสต์ก็จะนำมาเปรียบเทียบต่อไปเรื่อยๆ จนกว่าจะเปรียบเทียบภายในลิสต์นั้นหมด ถ้าลิสต์ใดหมดก่อน ลิสต์นั้นจะเป็นลิสต์ที่มีค่าเล็กกว่า
[boo,hoo]<[adder,zebra,bee]. ผลลัพธ์ false
[boo,hoo]<[boo,hoo,adder,zebra,bee]. ผลลัพธ์ true
การเปรียบเทียบระหว่าง Tuple
จะเปรียบเทียบจำนวน element ใน tuple ก่อน ตามด้วยเปรียบเทียบค่าในแต่ละส่วนเทียบกัน
{boo,hoo}<{adder,zebra,bee}. ผลลัพธ์ true
{boo,hoo}<{boo,hoo,adder,zebra,bee}. ผลลัพธ์ true
{boo,hoo}<{coo,aoo}. ผลลัพธ์ true
{yoo,hoo}<{coo,aoo}. ผลลัพธ์ false
ไม่มีความคิดเห็น:
แสดงความคิดเห็น