Tour of Rust - Ch.2 - Basic Control Flow
เขียนวันที่ : Apr 12, 2022
บททึกการเรียน Tour Of Rust บทเรียนที่ 2 - Tour of Rust - Chapter 2 - Basic Control Flow
Chapter 2 - Basic Control Flow 🦀
If/Else
- condition ไม่ต้องใส่วงเล็บ (มีแอบขิงด้วยว่า looks nice and clean 🤣)
- condition ใน Rust ต้องเป็น
bool
มันจะไม่แปลงเป็น boolean type ให้แบบ JavaScript เราต้องกำหนดให้เป็น boolean เช่น
fn main() {
let x = 42;
// แบบนี้ไม่ได้
if x {}
if x < 42 {
println!("less than 42");
} else if x == 42 {
println!("is 42");
} else {
println!("greater than 42");
}
}
- logic operators ใช้ได้หมด
==
,!=
,<
,>
,<=
,>=
,!
,||
,&&
- If ใน let statement ก็ทำได้ แบบนี้
fn main() {
let condition = true;
let number = if condition { 5 } else { 6 };
}
- ใน statment ต้องเป็น type เดียวกันด้วยนะ ทั้ง if และ else แบบข้างล่างนี้ไม่ได้
fn main() {
let condition = true;
let number = if condition { 5 } else { "six" };
}
Loop
- loop แบบ infinity
fn main() {
loop {
println!("again!");
}
}
- ใช้
loop
สำหรับ infinity loop จนกว่าเราจะกดหยุดโปรแกรม (Ctrl + C) หรือใช้break
fn main() {
let mut x = 0;
loop {
x += 1;
if x == 42 {
break;
}
}
println!("{}", x);
}
While
while loop ก็คล้ายๆ ภาษาอื่นๆ กำหนด condition ถ้า condition เป็น false ก็จบการทำงาน ถ้า true ก็ทำงานใน loop
fn main() {
let mut x = 0;
while x != 42 {
x += 1;
}
println!("x is {}", x);
}
For
- Loop ใน Rust สามารถวันลูปซ้ำๆ ได้กับ Iterator ใดๆก็ได้
- Iterator คือไรหว่า อธิบายไงดี เป็น object / collection ที่เราสามารถเข้าถึง item ข้างในได้ พวก
map
- สร้าง iterator จาก range ตัวเลข
0..5
คือ Iterator ที่มี 0,1,2,3,4 ..
- สร้าง iterator ตั้งแต่เลข 0 - 5 แต่ไม่รวม 5 เช่น0..5
..=
- สร้าง iterator ตั้งแต่ 0 - 5 (รวม เลขหลัง) เช่น0..=5
Match
- เวอร์ชั่น upgrade ของ If / Else If statement
- match จะจับคู่เงื่อนไขที่เป็นไปได้ทั้งหมด
- match เราต้องตรวจสอบ condition ให้ครอบคลุมให้หมด
- มักเจอพร้อมกับ destructuring
- อ่านอาจจะไม่เห็นภาพ ถ้าดูตัวอย่างโค๊ดน่าจะเข้าใจง่ายกว่า
- match เป็นได้ทั้ง expression (มี comma) และ block (ไม่มี comma)
fn main() {
let x = 42;
match x {
0 => {
println!("found zero");
}
// match ทั้ง 1 และ 2
1 | 2 => {
println!("found 1 or 2!");
}
// match แบบ range ก็ได้
3..=9 => {
println!("found a number 3 to 9 inclusively");
}
// bind ใส่ตัวแปรก็ได้ด้วย
matched_num @ 10..=100 => {
println!("found {} number between 10 to 100!", matched_num);
}
// default match เอาไว้ดักทุกเคส คล้ายๆ switch case default
_ => {
println!("found something else!");
}
}
}
- ถ้ามอง syntax แบบนี้จะดูง่ายขึ้นมั้ยนะ
let result = match value {
value_to_match => { ... },
value_to_match => { ... },
value_to_match => { ... },
_ => { ... }
};
โจทย์ classic ถ้าใครไม่เข้าใจ match ลองทำโจทย์พวกนับเกรดที่ใช้ if/else มาใช้ match ดู ถ้าเขียนโปรแกรมมาก่อน น่าจะไม่ยากนะ ez 🤣
Returning Value from loop
- ใน loop เราใช้
break
เพื่อ return ค่าได้เหมือนกัน
fn main() {
let mut x = 0;
let v = loop {
x += 1;
if x == 13 {
break "found the 13";
}
};
println!("from loop: {}", v);
}
Returning Values From Block Expressions
- If แบบ let statement จริงๆ ย่อๆ แบบ ternary expression ก็ได้ แบบนี้
let v = if x < 42 { -1 } else { 1 };
- ถ้า function หรือ expression ไม่มี
;
ต่อท้าย มันจะ return ค่า จาก block
let result = match food {
"hotdog" => "is hotdog",
// ไม่ต้องมี {} ก็ได้
_ => "is not hotdog",
};
- ซึ่งเทียบเท่ากับ (ไม่ต้องมี
;
)
_ => {
"is not hotdog"
}
- เวลา return ค่า ใน function จะต้องเจอ บรรทัดสุดท้าย ที่ไม่มี semicolon (
;
) นั่นแหละครับ เดี๋ยวจะเข้าใจเอง
สรุป บทที่ 2
บทนี้เริ่มยากขึ้นมาหน่อย มี loop ที่อาจจะไม่ค่อยชิน ปกติใช้ for หรือ while ต้องกำหนด condition เลย แต่อันนี้ ใช้ loop แล้วไป break เอา ส่วนเรื่อง match คิดว่าน่าจะใช้และเจอบ่อยมาก สำหรับบทนี้เหมือนเป็นบทนำ แนะนำเบื้องต้นเท่านั้น และส่วน return ค่า เวลาไม่ใส่ ;
แรกๆ ผมก็ไม่ชิน สายตา ชอบมองไม่ออก ว่าอันไหนใส่ ;
หรือไม่ใส่
อ่านเพิ่มเติม