Skip to content

Commit 4e8d6d2

Browse files
authored
Merge pull request #77 from rust-tieng-viet/claude/update-content-pages-011CULRESPubffdRFHtEnwrR
feat: update outdated content and add comprehensive content to empty pages
2 parents 7376105 + 7938e52 commit 4e8d6d2

File tree

8 files changed

+2049
-13
lines changed

8 files changed

+2049
-13
lines changed

src/SUMMARY.md

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,6 @@
120120

121121
- [Viết Docs](./basic/rustdoc/README.md)
122122

123-
- [Doc comments](./basic/code-comment/doc-comment.md)
124123
- [Sử dụng README.md làm crate document](./basic/rustdoc/doc-README.md)
125124

126125

@@ -175,12 +174,6 @@
175174
# Data Engineering
176175

177176
- [Xử lý và phân tích dữ liệu](./data-engineering/data-processing.md)
178-
- [Polars](./crates/polars.md)
179-
- [serde](./crates/serde.md)
180-
- [serde_json](./crates/serde/serde_json.md)
181-
- [serde_toml](./crates/serde/serde_toml.md)
182-
- [serde_csv](./crates/serde/serde_csv.md)
183-
- [serde_yaml](./crates/serde/serde_yaml.md)
184177
- [High-performance data pipeline](./data-engineering/first-data-pipeline.md)
185178
- [Building scalable data-driven applications using Rust](./data-engineering/data-driven.md)
186179
- [Rust as an alternative to Python for data engineering tasks](./data-engineering/rust-as-alternative-python.md)

src/basic/match/literals.md

Lines changed: 160 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,161 @@
11
# Matching giá trị
2+
3+
Pattern matching với literals (giá trị cụ thể) là cách sử dụng phổ biến nhất của `match` trong Rust. Bạn có thể match trực tiếp với các giá trị cụ thể như số, ký tự, hay chuỗi.
4+
5+
## Match với số nguyên
6+
7+
```rust
8+
fn describe_number(x: i32) {
9+
match x {
10+
1 => println!("Một"),
11+
2 => println!("Hai"),
12+
3 => println!("Ba"),
13+
_ => println!("Số khác"),
14+
}
15+
}
16+
17+
fn main() {
18+
describe_number(1); // In ra: Một
19+
describe_number(5); // In ra: Số khác
20+
}
21+
```
22+
23+
Pattern `_` (underscore) là một wildcard pattern, match với mọi giá trị còn lại. Nó giống như `default` case trong `switch` của C/Java.
24+
25+
## Match với ký tự
26+
27+
```rust
28+
fn describe_char(c: char) {
29+
match c {
30+
'a' => println!("Chữ a"),
31+
'b' => println!("Chữ b"),
32+
'0'..='9' => println!("Một chữ số"),
33+
_ => println!("Ký tự khác"),
34+
}
35+
}
36+
37+
fn main() {
38+
describe_char('a'); // In ra: Chữ a
39+
describe_char('5'); // In ra: Một chữ số
40+
describe_char('z'); // In ra: Ký tự khác
41+
}
42+
```
43+
44+
Ở ví dụ trên, `'0'..='9'` là range pattern, match với mọi ký tự từ '0' đến '9'.
45+
46+
## Match với boolean
47+
48+
```rust
49+
fn is_true(b: bool) -> &'static str {
50+
match b {
51+
true => "Đúng rồi!",
52+
false => "Sai rồi!",
53+
}
54+
}
55+
56+
fn main() {
57+
println!("{}", is_true(true)); // In ra: Đúng rồi!
58+
println!("{}", is_true(false)); // In ra: Sai rồi!
59+
}
60+
```
61+
62+
Với boolean, bạn không cần dùng `_` vì chỉ có 2 giá trị: `true``false`.
63+
64+
## Match với range
65+
66+
```rust
67+
fn categorize_age(age: u32) {
68+
match age {
69+
0 => println!("Trẻ sơ sinh"),
70+
1..=12 => println!("Trẻ em"),
71+
13..=19 => println!("Thiếu niên"),
72+
20..=64 => println!("Người trưởng thành"),
73+
65..=u32::MAX => println!("Người cao tuổi"),
74+
}
75+
}
76+
77+
fn main() {
78+
categorize_age(5); // In ra: Trẻ em
79+
categorize_age(25); // In ra: Người trưởng thành
80+
categorize_age(70); // In ra: Người cao tuổi
81+
}
82+
```
83+
84+
Cú pháp `1..=12` là inclusive range (bao gồm cả 1 và 12). Nếu dùng `1..12` thì sẽ là exclusive range (từ 1 đến 11, không bao gồm 12).
85+
86+
## Exhaustiveness Checking
87+
88+
Một điểm mạnh của `match` trong Rust là compiler sẽ kiểm tra xem bạn đã xử lý hết tất cả các trường hợp chưa. Điều này giúp tránh bugs.
89+
90+
```rust
91+
fn check_number(x: i32) {
92+
match x {
93+
1 => println!("Một"),
94+
2 => println!("Hai"),
95+
// ❌ Compiler sẽ báo lỗi: pattern `i32::MIN..=0_i32` and `3_i32..=i32::MAX` not covered
96+
}
97+
}
98+
```
99+
100+
Bạn phải xử lý tất cả các trường hợp, hoặc sử dụng `_` để bắt các trường hợp còn lại:
101+
102+
```rust
103+
fn check_number(x: i32) {
104+
match x {
105+
1 => println!("Một"),
106+
2 => println!("Hai"),
107+
_ => println!("Số khác"), // ✅ OK
108+
}
109+
}
110+
```
111+
112+
## So sánh với `if-else`
113+
114+
Trong một số ngôn ngữ khác như JavaScript hay Python, bạn có thể dùng `if-else` để làm việc tương tự:
115+
116+
```javascript
117+
// JavaScript
118+
function describeNumber(x) {
119+
if (x === 1) {
120+
console.log("Một");
121+
} else if (x === 2) {
122+
console.log("Hai");
123+
} else if (x === 3) {
124+
console.log("Ba");
125+
} else {
126+
console.log("Số khác");
127+
}
128+
}
129+
```
130+
131+
Tuy nhiên `match` trong Rust có nhiều ưu điểm hơn:
132+
- Compiler kiểm tra exhaustiveness (đã xử lý hết tất cả trường hợp chưa)
133+
- Dễ đọc và rõ ràng hơn với nhiều trường hợp
134+
- Có thể match với pattern phức tạp (struct, enum, ...)
135+
136+
## Trả về giá trị
137+
138+
`match` là một expression, có nghĩa là nó có thể trả về giá trị:
139+
140+
```rust
141+
fn number_to_string(x: i32) -> String {
142+
match x {
143+
1 => "một".to_string(),
144+
2 => "hai".to_string(),
145+
3 => "ba".to_string(),
146+
_ => format!("số {}", x),
147+
}
148+
}
149+
150+
fn main() {
151+
let result = number_to_string(2);
152+
println!("{}", result); // In ra: hai
153+
}
154+
```
155+
156+
Tất cả các arm (nhánh) của `match` phải trả về cùng một kiểu dữ liệu.
157+
158+
## References
159+
160+
- [Match - The Rust Programming Language](https://doc.rust-lang.org/book/ch06-02-match.html)
161+
- [Patterns and Matching](https://doc.rust-lang.org/book/ch18-00-patterns.html)

src/basic/match/multiple.md

Lines changed: 211 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,212 @@
11
# Matching Multiple
2+
3+
Trong Rust, bạn có thể match nhiều pattern trong cùng một arm của `match` expression. Điều này giúp code ngắn gọn và dễ đọc hơn khi nhiều giá trị cần được xử lý giống nhau.
4+
5+
## Match nhiều giá trị với `|` (OR pattern)
6+
7+
Toán tử `|` (pipe) cho phép bạn match nhiều pattern trong cùng một arm:
8+
9+
```rust
10+
fn describe_number(x: i32) {
11+
match x {
12+
1 | 2 => println!("Một hoặc hai"),
13+
3 | 4 | 5 => println!("Ba, bốn hoặc năm"),
14+
_ => println!("Số khác"),
15+
}
16+
}
17+
18+
fn main() {
19+
describe_number(1); // In ra: Một hoặc hai
20+
describe_number(4); // In ra: Ba, bốn hoặc năm
21+
describe_number(7); // In ra: Số khác
22+
}
23+
```
24+
25+
## Kết hợp OR pattern với range
26+
27+
Bạn có thể kết hợp nhiều pattern và range trong cùng một arm:
28+
29+
```rust
30+
fn categorize_number(x: i32) {
31+
match x {
32+
0 => println!("Số không"),
33+
1..=10 | 100 => println!("Từ 1 đến 10, hoặc 100"),
34+
-1 | -2 | -3 => println!("Số âm nhỏ"),
35+
_ => println!("Số khác"),
36+
}
37+
}
38+
39+
fn main() {
40+
categorize_number(5); // In ra: Từ 1 đến 10, hoặc 100
41+
categorize_number(100); // In ra: Từ 1 đến 10, hoặc 100
42+
categorize_number(-2); // In ra: Số âm nhỏ
43+
}
44+
```
45+
46+
## Match với ký tự
47+
48+
```rust
49+
fn is_vowel(c: char) -> bool {
50+
match c {
51+
'a' | 'e' | 'i' | 'o' | 'u' => true,
52+
'A' | 'E' | 'I' | 'O' | 'U' => true,
53+
_ => false,
54+
}
55+
}
56+
57+
fn main() {
58+
println!("{}", is_vowel('a')); // true
59+
println!("{}", is_vowel('b')); // false
60+
println!("{}", is_vowel('E')); // true
61+
}
62+
```
63+
64+
Hoặc ngắn gọn hơn:
65+
66+
```rust
67+
fn is_vowel(c: char) -> bool {
68+
match c {
69+
'a' | 'e' | 'i' | 'o' | 'u' | 'A' | 'E' | 'I' | 'O' | 'U' => true,
70+
_ => false,
71+
}
72+
}
73+
```
74+
75+
## Match với enum
76+
77+
OR pattern rất hữu ích khi làm việc với enum:
78+
79+
```rust
80+
enum Direction {
81+
North,
82+
South,
83+
East,
84+
West,
85+
}
86+
87+
fn is_horizontal(dir: Direction) -> bool {
88+
match dir {
89+
Direction::East | Direction::West => true,
90+
Direction::North | Direction::South => false,
91+
}
92+
}
93+
94+
fn main() {
95+
println!("{}", is_horizontal(Direction::East)); // true
96+
println!("{}", is_horizontal(Direction::North)); // false
97+
}
98+
```
99+
100+
## Ví dụ thực tế: HTTP status codes
101+
102+
```rust
103+
fn handle_status_code(code: u16) {
104+
match code {
105+
200 | 201 | 202 | 204 => println!("Success"),
106+
301 | 302 | 303 | 307 | 308 => println!("Redirect"),
107+
400 | 401 | 403 | 404 => println!("Client error"),
108+
500 | 501 | 502 | 503 => println!("Server error"),
109+
_ => println!("Unknown status"),
110+
}
111+
}
112+
113+
fn main() {
114+
handle_status_code(200); // In ra: Success
115+
handle_status_code(404); // In ra: Client error
116+
handle_status_code(500); // In ra: Server error
117+
}
118+
```
119+
120+
Hoặc kết hợp với range để ngắn gọn hơn:
121+
122+
```rust
123+
fn handle_status_code(code: u16) {
124+
match code {
125+
200..=299 => println!("Success"),
126+
300..=399 => println!("Redirect"),
127+
400..=499 => println!("Client error"),
128+
500..=599 => println!("Server error"),
129+
_ => println!("Unknown status"),
130+
}
131+
}
132+
```
133+
134+
## So sánh với ngôn ngữ khác
135+
136+
Trong JavaScript, bạn có thể sử dụng multiple `case` statements mà không có `break`:
137+
138+
```javascript
139+
// JavaScript
140+
function describeNumber(x) {
141+
switch (x) {
142+
case 1:
143+
case 2:
144+
console.log("Một hoặc hai");
145+
break;
146+
case 3:
147+
case 4:
148+
case 5:
149+
console.log("Ba, bốn hoặc năm");
150+
break;
151+
default:
152+
console.log("Số khác");
153+
}
154+
}
155+
```
156+
157+
Trong Python (từ version 3.10), bạn có thể dùng `|` trong `match`:
158+
159+
```python
160+
# Python 3.10+
161+
def describe_number(x):
162+
match x:
163+
case 1 | 2:
164+
print("Một hoặc hai")
165+
case 3 | 4 | 5:
166+
print("Ba, bốn hoặc năm")
167+
case _:
168+
print("Số khác")
169+
```
170+
171+
Rust's OR pattern (`|`) tương tự như Python, nhưng được kiểm tra tại compile time để đảm bảo type safety.
172+
173+
## Match với tuple
174+
175+
Bạn cũng có thể sử dụng OR pattern với tuple:
176+
177+
```rust
178+
fn describe_point(point: (i32, i32)) {
179+
match point {
180+
(0, 0) => println!("Gốc tọa độ"),
181+
(0, _) | (_, 0) => println!("Nằm trên trục"),
182+
(x, y) if x == y => println!("Nằm trên đường chéo"),
183+
_ => println!("Điểm thông thường"),
184+
}
185+
}
186+
187+
fn main() {
188+
describe_point((0, 0)); // In ra: Gốc tọa độ
189+
describe_point((0, 5)); // In ra: Nằm trên trục
190+
describe_point((3, 0)); // In ra: Nằm trên trục
191+
describe_point((4, 4)); // In ra: Nằm trên đường chéo
192+
describe_point((2, 3)); // In ra: Điểm thông thường
193+
}
194+
```
195+
196+
## Lưu ý quan trọng
197+
198+
Khi sử dụng OR pattern, tất cả các pattern phải bind (gán) cùng một tập hợp các biến. Ví dụ sau sẽ **không** compile:
199+
200+
```rust
201+
// ❌ Lỗi: variable `x` is not bound in all patterns
202+
match (1, 2) {
203+
(x, _) | (_, x) => println!("{}", x), // lỗi!
204+
}
205+
```
206+
207+
Lý do là trong pattern đầu tiên `(x, _)`, `x` được bind với phần tử đầu tiên, nhưng trong pattern thứ hai `(_, x)`, `x` được bind với phần tử thứ hai. Compiler không thể xác định `x` nên lấy giá trị nào.
208+
209+
## References
210+
211+
- [Multiple Patterns - The Rust Programming Language](https://doc.rust-lang.org/book/ch18-03-pattern-syntax.html#multiple-patterns)
212+
- [Patterns and Matching](https://doc.rust-lang.org/book/ch18-00-patterns.html)

0 commit comments

Comments
 (0)