這次會記錄第三章與其他語言相比,較為特別一點的部分,畢竟大多數知識是共通的。
Rust是靜態類型語言,意思是在編譯時期就需要知道每一個變數的型別。如果有看前幾篇文章,會發現有時候透過let
定義後有宣告型別,有時候卻沒有,實際上是新語言的編譯器現在大多可以做型別推斷,即根據怎麼使用來回推實際值可能是什麼型別。因此,大多數的狀況下可以選擇不寫。
特別說一下,Java 10
以後也加入var
做型別推斷,所以這兩種方式都是可以的寫法,只不過在我接觸過的專案中,實務上還是比較少人這麼做...
var message = "Hello, Type Inference!";
String greeting = "Hello world";
照字面翻會直覺是純量,有其他語言背景的話對此不會太陌生,就是primitive type
。
i8
, i16
, i32
, i64
, i128
, isize
) and unsigned (u8
, u16
, u32
, u64
, u128
, usize
).f32
and f64
.char
, which represents a single Unicode scalar value.bool
, which can be either true
or false
.整數又分sign
跟unsign
,找一下計算機概論的記憶:
short、long
等差異isize
跟usize
是根據程式運行在哪個架構上,決定採用哪種大小浮點數一樣參考IEEE 754
,Rust預設使用f64
組合型態有兩種:
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
習慣的人,對這語法應該不陌生。
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
的使用。