พื้นฐาน
เริ่มต้น, data type และ operation พื้นฐาน
เริ่มต้น
ติดตั้ง Elixir
ขั้นตอนการติดตั้งสำหรับแต่ละระบบปฏิบัติการสามารถเข้าไปดูในเว็บไซต์ elixir-lang.org ในส่วนของแนวทางการติดตั้ง Elixir
หลังจากติดตั้งสำเร็จ เราสามารถยืนยันเวอร์ชันที่ติดตั้งได้ง่ายๆ ดังนี้
$ elixir -v
Erlang/OTP {{ site.erlang.OTP }} [erts-{{ site.erlang.erts }}] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10] [hipe] [kernel-poll:false] [dtrace]
Elixir {{ site.elixir.version }}
ลองเล่นกับ Interactive Mode
Elixir มาพร้อมกับ IEx ซึ่งเป็น interactive shell ที่เปิดโอกาสให้เราสามารถประมวลผลนิพจน์ (expression) ของภาษา Elixir ได้อย่างต่อเนื่อง
มาเริ่มต้นกันด้วยการรัน iex
Erlang/OTP {{ site.erlang.OTP }} [erts-{{ site.erlang.erts }}] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10] [hipe] [kernel-poll:false] [dtrace]
Interactive Elixir ({{ site.elixir.version }}) - press Ctrl+C to exit (type h() ENTER for help)
iex>
เอาล่ะ! ทีนี้ลองมาเริ่มจากนิพจน์ง่ายๆ กัน
iex> 2+3
5
iex> 2+3 == 5
true
iex> String.length("The quick brown fox jumps over the lazy dog")
43
ไม่ต้องกังวลไปถ้ารู้สึกว่ายังไม่เข้าใจความหมายของทุกนิพจน์ แต่หวังว่าจะเข้าใจในแนวคิดของมันนะ
Data Type พื้นฐาน
Integers
iex> 255
255
รองรับเลขฐาน 2 (binary), 8 (octal) และ 16 (hexadecimal) ด้วยในตัว
iex> 0b0110
6
iex> 0o644
420
iex> 0x1F
31
Floats
ใน Elixir นั้น เลขทศนิยมต้องใส่จุดทศนิยมหลังตัวเลขอย่างน้อย 1 หลัก รูปแบบที่ใช้เก็บทศนิยมเป็นแบบ 64-bit double precision และรองรับ e
สำหรับค่า exponential (ใช้เลขฐานมายกกำลัง เช่น 1.0e-10 มี 1.0 เป็นฐาน 10 ก็จะเป็น 1.0 * 10^-10 เป็นต้น)
iex> 3.14
3.14
iex> .14
** (SyntaxError) iex:2: syntax error before: '.'
iex> 1.0e-10
1.0e-10
Booleans
Elixir นั้นใช้ true
และ false
โดยนอกจาก false
กับ nil
แล้ว ค่าอื่นๆ นับว่ามีค่าเป็นจริง (truthy)
iex> true
true
iex> false
false
Atoms
atom เป็นค่าคงที่ที่มีค่าเป็นชื่อของตัวมันเอง ถ้าเขียน Ruby มาก่อนล่ะก็ มันก็เหมือนกับ symbol นั่นแหละ
iex> :foo
:foo
iex> :foo == :bar
false
ซึ่งจริงๆ แล้ว boolean true
และ false
นั้นก็เป็น atom :true
และ :false
ตามลำดับ
iex> is_atom(true)
true
iex> is_boolean(:true)
true
iex> :true === true
true
ชื่อของ module ใน Elixir ก็เป็น atom อีกเช่นกัน เช่น MyApp.MyModule
เป็น atom แม้ว่าจะไม่เคยประกาศ module นี้มาก่อนเลยก็ตาม
iex> is_atom(MyApp.MyModule)
true
นอกจากนี้ atom ยังถูกใช้ในการอ้างอิงถึง module ใน library ที่เขียนด้วย Erlang รวมถึง module ใน Erlang เองด้วย
iex> :crypto.strong_rand_bytes 3
<<23, 104, 108>>
Strings
string ใน Elixir นั้นเข้ารหัสด้วย UTF-8 และใช้อัญประกาศคู่ (double quote) ในการประกาศ
iex> "Hello"
"Hello"
iex> "dziękuję"
"dziękuję"
string รองรับการขึ้นบรรทัดใหม่ และ escape sequences
iex> "foo
...> bar"
"foo\nbar"
iex> "foo\nbar"
"foo\nbar"
Elixir ยังมี data type ที่ซับซ้อนกว่าที่กล่าวมาข้างต้น เราจะได้เรียนเพิ่มเติมตอนที่ไปถึงเรื่องของ collections และ functions
Operation พื้นฐาน
Arithmetic
คงพอจะเดากันออกว่า Elixir มี +
, -
, *
และ /
ให้ใช้ สิ่งหนึ่งที่อยากให้จำไว้คือ /
จะคืนค่าเป็น float เสมอ
iex> 2 + 2
4
iex> 2 - 1
1
iex> 2 * 5
10
iex> 10 / 5
2.0
หากว่าอยากได้ผลหารเป็นจำนวนเต็ม หรือหารเอาเศษ Elixir มีฟังก์ชัน div
และ rem
(rem น่าจะมาจาก division remainder คือเศษจากการหาร) ให้ใช้งานตามลำดับ
iex> div(10, 5)
2
iex> rem(10, 3)
1
Boolean
Elixir มี ||
, &&
และ !
เป็น boolean operators ซึ่งสามารถใช้ได้กับทุกๆ type อย่างที่กล่าวไปแล้วว่า นอกจาก nil
และ false
แล้ว ทุกๆ ค่าจากมุมมองของ boolean จะมีค่าเป็นจริง (truthy)
iex> -20 || true
-20
iex> false || 42
42
iex> 42 && true
true
iex> 42 && nil
nil
iex> !42
false
iex> !false
true
นอกจากนี้ยังมี operator เพิ่มเติม ที่ argument ตัวแรกต้องเป็น boolean (true
หรือ false
) เสมอ
iex> true and 42
42
iex> false or true
true
iex> not false
true
iex> 42 and true
** (ArgumentError) argument error: 42
iex> not 42
** (ArgumentError) argument error
การเปรียบเทียบ
Elixir มาพร้อมกับตัวเปรียบเทียบที่เราคุ้นเคย ซึ่งก็คือ ==
, !=
, ===
, !==
, <=
, >=
, <
, และ >
.
iex> 1 > 2
false
iex> 1 != 2
true
iex> 2 == 2
true
iex> 2 <= 3
true
สำหรับการเปรียบเทียบที่เข้มงวดระหว่าง integers กับ floats ให้ใช้ ===
iex> 2 == 2.0
true
iex> 2 === 2.0
false
คุณสมบัติอย่างหนึ่งที่สำคัญของ Elixir คือ type ที่ต่างกัน สามารถนำมาเปรียบเทียบกันได้ ซึ่งมีประโยชน์โดยเฉพาะในการเรียงลำดับ ไม่จำเป็นต้องท่องจำลำดับก็ได้ แต่อยากให้รู้เอาไว้ว่ามันมีตัวตนอยู่นะ
number < atom < reference < function < port < pid < tuple < map < list < bitstring
ซึ่งลำดับข้างต้นทำให้มีการเปรียบเทียบที่น่าสนใจเกิดขึ้น ซึ่งคงจะไม่เจอในภาษาอื่นๆ
iex> :hello > 999
true
iex> {:hello, :world} > [1, 2, 3]
false
การสอดแทรก string
หากเคยเขียน Ruby มาก่อน ก็คงจะรู้สึกว่าการสอดแทรก string (string interpolation) ใน Elixir นั้นหน้าตาคุ้นๆ
iex> name = "Sean"
iex> "Hello #{name}"
"Hello Sean"
การต่อ string
เราสามารถนำ string มาต่อกันได้โดยใช้เครื่องหมาย <>
iex> name = "Sean"
iex> "Hello " <> name
"Hello Sean"
Caught a mistake or want to contribute to the lesson? Edit this lesson on GitHub!