0x03 – Rust Concept

Biến – Tính thay đổi

Mặc định khi tạo một biến, biến đó không thể được thay đổi giá trị.

Để tạo một biến có thể thay đổi được giá trị, hãy làm như sau:

fn main() {
    let mut x = 5;
}

Khác nhau giữa biến và hằng số

Hằng số luôn luôn không thể thay đổi giá trị, do đó từ khóa mut sẽ không dùng được trong trường hợp này.

Khi khai báo một hằng số, sữ dụng từ khóa const và phải luôn luôn khai báo kiểu dữ liệu.

const PI: f32 = 3.141592654;

Shadowing

Khi tạo ra một biến, sau đó tiếp tục khai báo một biến trùng với tên biến vừa rồi, thì ta gọi biến thứ nhất shadow biến thứ hai.

Khi truy cập tên biến, giá trị của biến sẽ là giá trị sau cùng nó được định nghĩa, trong trường hợp này là biến thứ hai.

fn main() {
    let x = 10;
    println!("Before shadow, x = {}", x);
    
    let x = 5;
    println!("After shadow, x = {}", x);
    
}

Kết quả khi thực thi sẽ là

Before shadow, x = 10
After shadow, x = 5

Note: Khi định nghĩa lại biến sau lần thứ nhất, nếu kiểu dữ liệu của hai lần khác nhau, sẽ có lỗi khi compile.

Kiểu dữ liệu

Mỗi giá trị trong Rust có một kiểu dữ liệu.

Kiểu vô hướng (scalar types)

Rust cung cấp 4 kiểu dữ liệu vô hướng, đó là số nguyên, số thập phân, chữ cái và boolean

Số nguyên

Độ dài dữ liệu cho số nguyên sẽ được định nghĩa dựa vào bảng dưới đây

Độ dài Signed Unsigned
8 bit i8 u8
16 bit i16 u16
32 bit i32 u32
64 bit i64 u64
128 bit i128 u128
arch isize usize

Độ dài arch sẽ do hệ điều hành quyết định, phụ thuộc vào kiến trúc 32bit hay 64bit.

Note: Biểu thị số nguyên có thể ỡ các dạng khác, như 0u8 hoặc có thêm các dấu ngăn cách như 1_000_000 (1000000 == 1_000_000)

Ngoài ra, kiểu số nguyên còn có thể được định nghĩa thông qua cách sau

Tên Ví dụ
Decimal 1_020
Hex 0x0ff
Octal 0077
Bin 0b1111_0000
Byte (u8) b'A'

Cách dùng sẽ là

let x: u8 = 50;
let y: i16 = 1_024;

Note: Kiểu dữ liệu mặc định là i32, và cho tốc độ nhanh nhất.

Số thập phân

Độ dài Cách khai báo
32 bits f32
64 bits f64

Cách dùng sẽ là

let x: f32 = 10.4;
let y: f64 = 543.21;

Note: Kiểu dữ liệu mặc định là f64

Kiểu boolean

Kiểu boolean sẽ chứa một giá trị true hoặc false.

let a: bool = true;

Kiểu ký tự

Trong Rust, các kiểu ký tự là một biểu thị của Unicode Scalar Value.

Do đó, kiểu ký tự có thể đại diện cho các ký tự nhiều hơn so với ASCII.

Ví dụ

let china_char      = "火";
let japan_char      = "の";
let emoji_char      = "🥳";

Kiểu dữ liệu hỗn hợp (Compound Types)

Compound Type là một nhóm các dữ liệu có kiểu khác nhau. Rust có hai dạng compound: tuples và array.

Tuple Type

Tuple là một tập hợp các giá trị với da đang các kiểu dữ liệu.

Note: Kiểu tuple không thể mở rộng hay giảm bớt phần tử.

Ví dụ khi khai báo một tuple

fn main() {
    let my_tuple: (i32, f64, u32) = (150, 25.8, 344);
}

Hoặc không cần khai báo kiểu dữ liệu, Rust sẽ tự động lấy ra kiểu dữ liệu dựa vào giá trị.

fn main() {
    let my_tuple = (250, 3.1416, "A");
    
    // Get value from tuple
    let (x, y, z) = my_tuple;

    println!("x = {}, y = {}, z ={}", x, y, z);
}

Một cách khác để có thể lấy giá trị từ tuple đó là sử dụng một dấu chấm (.) theo sau là index của giá trị cần lấy.

Ví dụ như sau

fn main() {
    let my_tuple = (250, 3.1416, "A");
    
    // Get value from tuple
    let x = my_tuple.0;
    let y = my_tuple.1;
    let z = my_tuple.2;

    println!("x = {}, y = {}, z ={}", x, y, z);
}

Kiểu Mảng (Array)

Một dạng khác của tập hợp các giá trị là mảng.

Một mảng chỉ chứa các phần tử có cùng kiểu dữ liệu.

fn main() {
   let my_array = [1,2,3,4,5];
   let names = ["James", "CodeChoVui", "Kunix"]; 
}

Khai báo một mảng với giá trị và size

fn main() {
    // Create an array of i32 data type with size of 5.
    let arr: [i32; 5] = [1,2,3,4,5];
}

Khai báo một mảng với các phần tử giống nhau

fn main() {
    // Create an array with 10 values of 2.
    let arr = [2; 10];
    // the same as arr = [2,2,2,2,2,2,2,2,2,2];
}

Truy cập giá trị của một mảng.

fn main() {
    let arr = ["Sun", "Earth", "Moon"];
    
    let the_sun = arr[0];
    let the_moon = arr[2];
    
    println!("{} and {}", the_sun, the_moon);
}
// Output: Sun and Moon

Note: Nếu truy cập index vượt qua số lượng của mảng, sẽ xảy ra lỗi index out of bounds khi run time.

CodeChoVui

CodeChoVui

Kỹ sư phần mềm, người đam mê hệ thống tối giản, web development và mã nguồn mở. Chia sẻ góc nhìn công nghệ và trải nghiệm lập trình thực chiến.

Theo dõi bản tin CodeChoVui

Nhận thông báo qua email mỗi khi có bài viết mới về lập trình, trải nghiệm phần mềm và công nghệ.

Gửi ý kiến thảo luận