📺 In Thông Tin Ra Màn Hình
Giới Thiệu
Trong lập trình, chúng ta thường xuyên cần in thông tin ra màn hình để:
- 🐛 Debug (tìm lỗi)
- 📊 Hiển thị kết quả
- 💬 Giao tiếp với người dùng
- ✅ Kiểm tra code có chạy đúng không
Giải Thích Cho Bạn 5 Tuổi
In ra màn hình giống như robot nói chuyện với bạn:
- 🤖 Robot có gì muốn nói
- 📢 Robot nói ra loa (màn hình)
- 👂 Bạn nghe (đọc trên màn hình)
println! là cách robot nói! 🎙️
🎯 Các Cách In Trong Rust
1. println! - In Và Xuống Dòng
fn main() {
println!("Hello");
println!("World");
}
Kết quả:
Hello
World
Đặc điểm:
- ✅ In và tự động xuống dòng
- ✅ Dùng nhiều nhất
2. print! - In Không Xuống Dòng
fn main() {
print!("Hello ");
print!("World");
}
Kết quả:
Hello World
Đặc điểm:
- ⚠️ Không xuống dòng
- ⚠️ Dùng ít hơn
3. eprintln! - In Lỗi (Error Output)
fn main() {
println!("Thông tin bình thường");
eprintln!("Đây là lỗi!");
}
Kết quả:
Thông tin bình thường
Đây là lỗi!
Đặc điểm:
- 🔴 In ra stderr (standard error)
- ✅ Dùng cho error messages
- ✅ Có thể redirect riêng
So Sánh
| Macro | Xuống dòng? | Output | Khi nào dùng |
|---|---|---|---|
println! | ✅ | stdout | Thông tin bình thường |
print! | ❌ | stdout | In trên cùng 1 dòng |
eprintln! | ✅ | stderr | Thông báo lỗi |
eprint! | ❌ | stderr | Lỗi không xuống dòng |
🎨 Format Strings - In Biến
Placeholder Cơ Bản: {}
fn main() {
let name = "An";
let age = 20;
println!("Tên tôi là {}", name);
println!("Tôi {} tuổi", age);
}
Kết quả:
Tên tôi là An
Tôi 20 tuổi
Giải thích:
{}= chỗ trống (placeholder)- Rust điền giá trị vào
{} - Theo thứ tự từ trái sang phải
Nhiều Placeholders
fn main() {
let name = "Bình";
let age = 25;
let city = "Hà Nội";
println!("{} {} tuổi, sống ở {}", name, age, city);
}
Kết quả:
Bình 25 tuổi, sống ở Hà Nội
Named Placeholders (Có Tên)
fn main() {
println!("{name} {age} tuổi", name="Cường", age=30);
}
Kết quả:
Cường 30 tuổi
Ưu điểm:
- ✅ Dễ đọc hơn
- ✅ Không cần đúng thứ tự
- ✅ Có thể dùng lại
Positional Arguments (Vị Trí)
fn main() {
println!("{0} ăn {1}, {0} thích {1}", "An", "phở");
}
Kết quả:
An ăn phở, An thích phở
Giải thích:
{0}= argument đầu tiên (index 0){1}= argument thứ hai (index 1)- Có thể dùng nhiều lần
🔢 In Các Kiểu Dữ Liệu
Số Nguyên (Integers)
fn main() {
let x = 42;
let y = -15;
println!("x = {}", x);
println!("y = {}", y);
println!("x + y = {}", x + y);
}
Kết quả:
x = 42
y = -15
x + y = 27
Số Thực (Floats)
fn main() {
let pi = 3.14159;
println!("Pi = {}", pi);
}
Kết quả:
Pi = 3.14159
Boolean
fn main() {
let is_rust_cool = true;
println!("Rust có tuyệt không? {}", is_rust_cool);
}
Kết quả:
Rust có tuyệt không? true
Ký Tự (Character)
fn main() {
let letter = 'A';
let emoji = '🦀';
println!("Chữ cái: {}", letter);
println!("Emoji: {}", emoji);
}
Kết quả:
Chữ cái: A
Emoji: 🦀
Chuỗi (String)
fn main() {
let greeting = "Xin chào";
let name = String::from("Rust");
println!("{} {}!", greeting, name);
}
Kết quả:
Xin chào Rust!
🎭 Format Specifiers - Định Dạng Chi Tiết
:? - Debug Format
Dùng cho kiểu dữ liệu phức tạp:
fn main() {
let numbers = vec![1, 2, 3, 4, 5];
println!("{:?}", numbers);
}
Kết quả:
[1, 2, 3, 4, 5]
:#? - Pretty Debug Format
In đẹp hơn cho struct/array phức tạp:
fn main() {
let data = vec![
vec![1, 2, 3],
vec![4, 5, 6],
vec![7, 8, 9],
];
println!("{:#?}", data);
}
Kết quả:
[
[
1,
2,
3,
],
[
4,
5,
6,
],
[
7,
8,
9,
],
]
:b - Binary (Nhị Phân)
fn main() {
let num = 42;
println!("Binary: {:b}", num);
}
Kết quả:
Binary: 101010
:x / :X - Hexadecimal (Thập Lục Phân)
fn main() {
let num = 255;
println!("Hex lowercase: {:x}", num);
println!("Hex uppercase: {:X}", num);
}
Kết quả:
Hex lowercase: ff
Hex uppercase: FF
:o - Octal (Bát Phân)
fn main() {
let num = 64;
println!("Octal: {:o}", num);
}
Kết quả:
Octal: 100
📏 Căn Chỉnh và Padding
Căn Trái :<width>
fn main() {
println!("{:<10}|", "left");
}
Kết quả:
left |
Căn Phải :>width
fn main() {
println!("{:>10}|", "right");
}
Kết quả:
right|
Căn Giữa :^width
fn main() {
println!("{:^10}|", "center");
}
Kết quả:
center |
Padding Với Ký Tự Khác
fn main() {
println!("{:*<10}|", "left");
println!("{:*>10}|", "right");
println!("{:*^10}|", "center");
}
Kết quả:
left******|
*****right|
**center**|
Bảng Đẹp
fn main() {
println!("{:<10} | {:>10} | {:^10}", "Name", "Age", "City");
println!("{:-<10}-+-{:->10}-+-{:-^10}", "", "", "");
println!("{:<10} | {:>10} | {:^10}", "An", 20, "Hà Nội");
println!("{:<10} | {:>10} | {:^10}", "Bình", 25, "Đà Nẵng");
}
Kết quả:
Name | Age | City
-----------+-----------+-----------
An | 20 | Hà Nội
Bình | 25 | Đà Nẵng