前言
這次會記錄第三章與其他語言相比,較為特別一點的部分,畢竟大多數知識是共通的。
資料型態
Rust是靜態類型語言,意思是在編譯時期就需要知道每一個變數的型別。如果有看前幾篇文章,會發現有時候透過let
定義後有宣告型別,有時候卻沒有,實際上是新語言的編譯器現在大多可以做型別推斷,即根據怎麼使用來回推實際值可能是什麼型別。因此,大多數的狀況下可以選擇不寫。特別說一下,
Java 10
以後也加入var
做型別推斷,所以這兩種方式都是可以的寫法,只不過在我接觸過的專案中,實務上還是比較少人這麼做...var message = "Hello, Type Inference!";
String greeting = "Hello world";
Scalar Types
照字面翻會直覺是純量,有其他語言背景的話對此不會太陌生,就是primitive type
。- Integer types: signed (
i8
,i16
,i32
,i64
,i128
,isize
) and unsigned (u8
,u16
,u32
,u64
,u128
,usize
). - Floating-point types:
f32
andf64
. - Character types:
char
, which represents a single Unicode scalar value. - Boolean types:
bool
, which can be eithertrue
orfalse
.
整數又分sign
跟unsign
,找一下計算機概論的記憶:
- 1 byte = 8 bits
- 整數是4個byte,也就是4 * 8 = 32 bits
- 32個bits表示有32個格子可以放0或1,也就是有232種組合作表示
- 如果要分正負號,第一個byte作為區分,剩下231種組合,範圍要扣除0
- 其他做為整數的變形,其實就是
short、long
等差異 isize
跟usize
是根據程式運行在哪個架構上,決定採用哪種大小
浮點數一樣參考IEEE 754
,Rust預設使用f64
Compound Types
組合型態有兩種:
- Tuple
- Array
Tuple的用法可以同時對多個變數賦值,類似Javascript中的Array destructuring
,不需要一個一個逐項取出。
fn main() {
let x: (i32, f64, u8) = (500, 6.4, 1);
let five_hundred = x.0;
let six_point_four = x.1;
let one = x.2;
}
函式
直接看個例子:
fn main() {
let x = plus_one(5);
println!("The value of x is: {x}");
}
fn plus_one(x: i32) -> i32 {
return x + 1;
}

基本上看過TypeScript及Python有撰寫type hint
習慣的人,對這語法應該不陌生。
- function簡寫為
fn
,預設均為private
,可以加上pub
變成public function - 型別定義在參數後面,須帶上
:
- 回傳值的定義接在
->
後面 return
顯式的提供回傳內容,或者不寫return
並移除;
流程控制
分支判斷
一般使用:
fn main() {
let number = 6;
if number % 4 == 0 {
println!("number is divisible by 4");
} else if number % 3 == 0 {
println!("number is divisible by 3");
} else if number % 2 == 0 {
println!("number is divisible by 2");
} else {
println!("number is not divisible by 4, 3, or 2");
}
}
三元運算類似寫法
fn main() {
let condition = true;
let number = if condition { 5 } else { 6 };
println!("The value of number is: {number}");
}
迴圈
loop
while
for
while
跟for
迴圈跟其他語言一樣,loop
則是直接定義迴圈,沒特別加入跳出邏輯下,就會無窮執行下去。另一方面也可以給loop
一個指定名稱,迴圈內可以根據分支控制狀況決定跳出到哪一層的loop
,也就是label
的用法,某種意義上來說也算是一種goto
的使用。