มาหัดเขียนโปรแกรมด้วยภาษา Rust กันเถอะ
สวัสดีครับ ช่วงนี้ผมสนใจอยากเขียนภาษา Rust ก็เลยเริ่มต้นศึกษา เวลาว่างๆ วันละ ครึ่งชม. หรือ 1ชั่วโมงบ้าง แล้วแต่วัน เลยอยากจะเขียนบล็อกบันทึกไว้ สืบเนื่องจาก ได้ยินชื่อภาษานี้มาหลายปีแล้ว แต่ไม่มีโอกาสได้ใช้งาน ก็เลยผ่านไป
แต่ช่วงนี้เป็นช่วงที่เริ่มมีเวลาศึกษามากขึ้น อาจจะเพราะว่าหยุดเขียนโค๊ดไปนาน ช่วงนี้มันเลยมีแรงจูงใจนิดนึง ตรงที่รู้สึกว่าเราไม่รู้อะไรเต็มไปหมดเลย ก็เลยอยากจะลองหัด Rust ซะ ซึ่งจริงๆแล้วช่วงนี้ผมหัดไปทั่วมากครับ ลองๆให้หมด ทั้ง Solidity / Blockchain กลับไปอ่าน C/C++ นั่งโค๊ด Python เล่นๆ แล้วค่อยมาดูอีกทีว่าจะโฟกัส หรือลงลึกไปที่ภาษาไหน ซึ่งมันก็ขึ้นอยู่กับตัวงานด้วย😅
ติดตั้ง Rustup
สำหรับ Mac OS และ Unix นั้นติดตั้งง่ายมากๆ เข้าไปในเว็บ rustup
ส่วน Windows จะชื่อไฟล์ rustup-init.exe
ดาวน์โหลดมา Install ได้เลย เป็น Script ที่ติดตั้ง package และจัดการ Path ให้เราเรียบร้อย ไม่ต้องทำอะไรเลย แค่ restart ตัว cmd.exe หรือ Powershell ก็สามารถใช้งาน Rust ได้แล้ว
เมื่อติดตั้งเสร็จเราจะได้ทั้ง rustc
ที่เป็น Compiler, Cargo
ที่เป็น Package Manager และ rustup
มาพร้อมๆกันเลย
ทดสอบดูว่า ติดตั้ง Rustup เรียบร้อย พร้อม rustc
ที่ใช้งานได้
ไฟล์ config ของ Rust environment จะอยู่ที่
~/.cargo/bin
ส่วน Windows ก็คือ%USERPROFILE%\.cargo\bin
หรือหากเราเคยติดตั้ง Rustup มาแล้ว อยากจะอัพเดท ก็สามารถอัพเดทได้ด้วยคำสั่ง
Text Editor
แน่นอน VS Code น่าจะกลายเป็น standard และคนนิยมที่สุดแล้วครับ ส่วน Extension ก็ลง Rust-Analyzer
แต่ถ้าใครใช้ IDE อย่างเช่น ของ JetBrains ก็ต้องใช้ตัวนี้ Plugin Rust (คิดว่าน่าจะใช้ได้ทั้ง CLion และ IntelijIDEA)
Hello World แรก
ทดลองเขียนโปรแกรมแรกกันเลย ตั้งชื่อไฟล์ว่า hello.rs
จากนั้น Compile เพื่อให้ได้ binary file เพื่อ execute มันได้
จะได้ไฟล์ Output ชื่อเดียวกับไฟล์ คือ hello
บน Windows คือ hello.exe
จากนั้นลอง execute มันดู
หาก Compile ไม่ผ่าน จะมี Error บอก (ลองลบ
!
ออกเหลือแค่println
ดูครับ)
จะเห็นได้ว่า Compile error message ก็มีประโยชน์มากๆ ทำให้เรารู้ว่า มันมีปัญหาอะไร บรรทัดไหน (สำหรับมือใหม่ ที่ไม่เคยเขียนโปรแกรม อาจจะกลัวๆ การอ่าน error message ลองพยายามอ่าน และทำความเข้าใจดูนะครับ ไม่ยาก)
Cargo เบื้องต้น
หลังจากลอง โปรแกรมแรกไปละ คราวนี้มาลองสร้างโปรเจ็คด้วยการใช้ Cargo
บ้าง
การสร้างโปรเจ็คใหม่ ใช้คำสั่ง cargo new <NAME>
เช่น
ตัว Cargo จะทำการสร้างโฟลเดอร์ hello-rust
ขึ้นมา พร้อมกับไฟล์ src/main.rs
และ Cargo.toml
ดังนี้
Cargo.toml
- เป็นเหมือน metadata ของโปรเจ็คเรา (เรียกว่า manifest) รู้ว่าใช้ library อะไรบ้าง หากใครเขียน Node.js มาก่อน ก็เหมือนกับpackage.json
ครับsrc/main.rs
- ไฟล์หลัก จะเห็นว่า เหมือนกับเราสร้างไฟล์ปกติเลย
ตัวอย่างข้างใน Cargo.toml
จะเห็นว่ามี name
มี version
มี editor
และส่วน dependencies
ทีนี้เวลา compile เราไม่ต้องใช้ rustc
แล้ว เราใช้คำสั่ง cargo run
ครับ (จริงๆ มันใช้ rustc
นั่นแหละ แต่ Cargo รันให้เรา)
จะได้ผลลัพธ์ประมาณนี้
ไฟล์จะถูก compile ไว้ที๋โฟลเดอร์ target
เราลอง execute ตัว binary ไฟล์ดูได้
ใช้คำสั่ง cargo build
เพื่อ compile และ build package
ข้อแตกต่างระหว่าง cargo build
และ cargo run
คือ
cargo run
จะ compile ถ้ายังไม่ถูก compile และ run โปรแกรมcargo build
จะ compile และ build เฉยๆ ไม่ได้รันโปรแกรม
หากอยากลบไฟล์ต่างๆ พวก binary ที่ compiled ไว้ ก็สามารถลบได้ด้วยคำสั่ง
การติดตั้ง Dependencies เช่น ติดตั้ง rand
ที่เป็น random generator บน crates.io ก็เพิ่มไปในไฟล์ Cargo.toml
ได้เลย
เวลา build
มันก็จะไปทำการดาวน์โหลด library มาติดตั้ง ก่อน compile ครับ
สุดท้าย Build ที่เราเห็น จะสังเกตเห็นว่า มัน unoptimized
เนื่องจากว่ามัน compile และ build binary ที่มีพวก debugging information หรืออะไรเต็มไปหมด ถ้าเราอยาก optimized / production ก็ใช้ --release
:
สำหรับ Cargo ก็มีหนังสือนะครับ ไปอ่านเพิ่มเติมได้ครับ The Cargo Book
Rust แบบรวบรัด สำหรับคนมีพื้นฐานภาษาอื่นๆ
- การประกาศตัวแปร ใช้
let
ชื่อตัวแปรจะใช้แบบsnake_case
- มีการใช้
const
เวลาประกาศค่าคงที่ - ปิด statment ด้วย semicolon
- ฟังค์ชั่น ใช้ keyword
fn
ดังที่เห็นตอน Hello World แรก println!
เป็น marco ที่เอาไว้แสดงค่า
ผลลัพธ์
ประกาศตัวแปร แบบกำหนด type รองรับ type ต่างๆ เช่น i8
, i16
, i32
, i64
, i128
และ unsigned integer
Float ตัว compiler จะใช้ f64
นอกจากจะกำหนด type ให้มัน
Boolean true
กับ false
Character และ String
If/Else ก็เหมือนภาษาอื่นๆ
Loop
Array ข้อมูลที่เก็บใน collection ต้องเป็น type เดียวกันและมีขนาดแน่นอน ตัวอย่าง กำหนด type และขนาด array:
Tuple เหมือนกับ Array ต่างกันที่ค่าข้างใน collection ต่างชนิดกันได้
Struct คล้ายๆ tuple ข้างในมี fields ที่ต่าง type กันได้
รองรับ Enum เหมือนภาษาอื่นๆ
Trait เหมือน Interface
กำหนด function รับค่า return ค่า
การ return ค่า ตอนจบ function จะใช้บรรทัดสุดท้าย (โดยไม่ต้องใส่ semicolon)
คร่าวๆ ก็มีประมาณนี้ สำหรับ Rust บทความแรก ก็ขอจบเพียงเท่านี้ก่อนครับ ส่วนตัวผมไม่กล้าแนะนำไปมากกว่านี้ เพราะยังไม่ชำนาญเท่าไหร่ กลัวจะสร้างความเข้าใจผิด 😅 แนะนำอ่านเพิ่มเติมครับ และหากใครมีอะไรแนะนำ ข้อเสนอแนะ มาพูดคุยกันได้นะครับ
- Rustling และ Rust Book เหมาะสำหรับอ่านคู่กันมากครับ ( ตอนนี้ผมก็กำลังหัดอยู่ตรงนี้ครับ วนๆ บทที่ 1-10 หลายรอบมาก)
- Tour of Rust - สามารถเข้าไปลองอ่าน ทำความเข้าใจได้ครับ
- Rust by Example - คล้ายๆ Rust Book อ่านเพิ่มเติม ต่อยอดได้ครับ
- Easy Rust - ผมชอบเล่มนี้ อ่านง่าย และเข้าใจง่ายดี (อ่านไปนิดเดียว)
- Rust Learning - รวม links & resources ต่างๆ น่าจะมีครบหมด อยู่ที่ตัวเราแล้วแหละ
สรุป
หวังว่าบทความนี้จะเป็นประโยชน์ และเป็นแนวทาง หรือแรงบันดาลใจให้ใครหลายๆ คนที่กำลังสนใจ Rust มาลองหัดเขียน กันดูนะครับ แล้วมาเรียนไปพร้อมๆกันครับ
Happy Coding ❤️
- Authors
-
Chai Phonbopit
เป็น Web Dev ในบริษัทแห่งหนึ่ง ทำงานมา 10 ปีกว่าๆ ด้วยภาษาและเทคโนโลยี เช่น JavaScript, Node.js, React, Vue และปัจจุบันกำลังสนใจในเรื่องของ Blockchain และ Crypto กำลังหัดเรียนภาษา Rust