Rust 學習筆記(1)

基本語法與結構

1
2
3
4
fu main() {
// output hello rust
println!("Hello, Rust!");
}
  • fn 定義函數的關鍵字。
  • main 函式為程式入口。
  • println!() 為呼叫 rust 的巨集。
  • ; 每一個指令結尾都需要一個分號,來表示指令的結束。
  • // 為單行註解。

變數與常數

不可變變數

在 Rust 中宣告變數的方式為 let <name> = <variable>,這個變數是不能被改變的。如果你試圖改變這個變數,你可能會得到 “cannot assign twice to immutable variable <name>” 的錯誤。

1
2
3
4
5
// Example
fn main() {
let name = "咪路";
let age = 18;
}

可變變數

在 Rust 中想要改變變數,可以在宣告時使用 let mut,讓它們可以被改變的。

1
2
3
4
5
// Example
fn main() {
let mut age = 18;
age = age + 1;
}

常數

大多數的語言當中,都有常數(constant) 的用法。在 Rust 中,宣告常數的方法為 const PI: f32 = 3.1415926,而在 Rust 中宣告常數必須給定類型 (f32 為 32 位元的浮點數表示)。

1
2
3
4
5
// Example
fn main() {
const PI: f32 = 3.1415926;
const LN2: f32 = 0.693147;
}

資料型別

在剛剛的常數中提到,常數的宣告必須給定資料類型,而一般用 let 或是 let mut 也可以將類型給宣告進去,其方法是在變數名稱後面加上 : <type>

以下我們介紹在 Rust 中的型別。

純量型別 - scalar

  1. 整數
    在整數的類型中分為帶號整數(signed) 與非帶號整數 (unsigned),在這兩者中有可以分為 8-bits, 16-bits, 32-bits, 64-bits, 128-bits 與系統架構位元數,表示方法如下:
Length signed unsigned
8-bits i8 u8
16-bits i16 u16
32-bits i32 u32
64-bits i64 u64
128-bits i128 u128
arch isize usize

並且可以用各種方始表達整數數值。如果數值長度太長可以運用 _ 來增加可讀性。

  • 十進位:一般表達方式。
  • 八進位:在數值前面加上前綴 0o
  • 十六進位:在數值前面加上前綴 0x
  • 二進位:在數值前面加上前綴 0b
1
2
3
4
5
6
7
// Example
fn main() {
let a: u8 = 12;
let b: i16 = 0o12;
let c: i32 = 0x9912_4F3A;
let d: isize = 0b1010111_10110110;
}
  1. 浮點小數
    幅點小數則分為 f32f64 分別表示 32 位元與 64 位元。
1
2
3
4
// Example
fn main() {
const PI: f32 = 3.1415926;
}
  1. 布林值
    布林值則使用 bool 表示。
1
2
3
4
// Example
fn main() {
let a: bool = true;
}
  1. 字元
    字元用 char 表示。
1
2
3
4
// Example
fn main() {
let a: char = '咪';
}

複合型別 - compound

  1. Tuple

由多個數值組成,每個數值的資料型別不一定要一致,使用方法為利用小括號將數值包起來,並使用逗號分隔開來。
我們可以利用 <tuple_name>.<index> 來存取 Tuple 裡的數值。也可以用 pattern matching 的方式拆成多個變數。

1
2
3
4
5
6
7
// Example
fn main() {
let a: (u8, f32, char) = (3, 3.14, 'P');
let (x, y, z) = a;

println!("The first value in a is {}.", a.0);
}

另外,一個空的 Turple 叫做 Unit,這通常代表一個空的數值或是空的回傳型別。

  1. Array

而 Array 與 Tuple 不同的是 Tuple 可以由多個型別組成,而 Array 的所有數值必須是相同的型別,使用方法為用中括號將多個數值刮起來,並用透好隔開。

並且我們可以用 [<type | value>; <count>] 來表示 <count><type> 的陣列,也可以用來表示一個有 <count><value> 的陣列。

存取上與其他大多數的語言一樣用 <array_name>[<index>];

1
2
3
4
5
6
// Example
fn main() {
let a: [u8; 5] = [1, 2, 3, 4, 5];
let b = [true; 5];
println!(b[3]); // true
}

使用者輸入

當我們要讀取使用者輸入時,必須先標準函式庫(std)中的 io 函式庫。

1
use std:io

接著我們使用函式庫中的 stdin 函式,這個函式會回傳 std::io::Stdin 的物件,其中有 read_line 函式,用來讀取一行輸入。

最後 readl_line 會回傳一個 Result,這是一個 enums,並且可能為 OkErr,並且有 expect 的函示,用來處理錯誤訊息。

1
2
3
4
5
6
7
8
9
10
11
use std:io

fn main() {
let mut user = String::new();

io::stdin()
.read_line(&mut user)
.expect("Read line failed!");

println!(user);
}

若你使用 expect,程式仍能編譯,但是會產生一個警告 (warning)。


參考資料: