【Rust】跟著社群資源學習Rust_(3)
avatar-img
Err500

【Rust】跟著社群資源學習Rust_(3)

更新於 發佈於 閱讀時間約 6 分鐘

前言

這次會記錄第三章與其他語言相比,較為特別一點的部分,畢竟大多數知識是共通的。

資料型態

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 and f64.
  • Character types: char, which represents a single Unicode scalar value.
  • Boolean types: bool, which can be either true or false.


整數又分signunsign,找一下計算機概論的記憶:

  1. 1 byte = 8 bits
  2. 整數是4個byte,也就是4 * 8 = 32 bits
  3. 32個bits表示有32個格子可以放0或1,也就是有232種組合作表示
  4. 如果要分正負號,第一個byte作為區分,剩下231種組合,範圍要扣除0
  5. 其他做為整數的變形,其實就是short、long等差異
  6. isizeusize是根據程式運行在哪個架構上,決定採用哪種大小


浮點數一樣參考IEEE 754,Rust預設使用f64


Compound Types


組合型態有兩種:

  1. Tuple
  2. 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;
}
raw-image

基本上看過TypeScriptPython有撰寫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


whilefor迴圈跟其他語言一樣,loop則是直接定義迴圈,沒特別加入跳出邏輯下,就會無窮執行下去。另一方面也可以給loop一個指定名稱,迴圈內可以根據分支控制狀況決定跳出到哪一層的loop,也就是label的用法,某種意義上來說也算是一種goto的使用。


avatar-img
Err500
12會員
76內容數
遇到的坑、解過的題、新知識的探索、舊時代的遺毒!? 工作後我發現,文件更新往往跟不上新需求的更迭,犯錯的歷史總是不斷重演。因此,我改變了方式,蒐集從程式上、系統上的每一次異常處理過程,好讓再次遇到相同的問題時能快速應變。此專題就是我的錯題本,期待日後不管在工作上或交流上遇到難題,都能輕鬆地應答:有什麼難的,我都踩過。
留言
avatar-img
留言分享你的想法!