Rust從入門到放棄(一):資料型別

Rust從入門到放棄(一):資料型別

大部分靜態編譯的語言都提供了型別支援,不同的型別分配不同大小的記憶體空間,當程式執行的時候,會根據熟悉型別去解析資料,譬如rust 裡面的i32 代表32位的整形,在記憶體裡面佔用四個位元組。下面介紹一下 rust 裡面常用的型別

bool

bool 型別比較簡單,這個和java 以及 go 等其他語言的一樣

let x = true; let y: bool = !x; let z = x && y; println!(“{}”, z); let z = x || y; println!(“{}”, z);

除了本身 true 和false以外,還支援 &&(與) 和 ||(或)操作。

char

rust的char 比較特殊,rust 統一採用Unicode編碼,每一個char 都是一個Unicode字元,佔用四個位元組。

let c1 = ‘\n’; let c2 = ‘\x7f’; let c3 = ‘\u{7FF0}’;

一個char 就可以代表一個漢字。如果需要節省空間,使用ASCII 碼方式儲存可以

let y :u8 = b‘A’; let s :&[u8;5] = b“hello”;

整數

整數可以分為 8位、16位、32位、64位、128位整形,每種整形有可以分為有符號和無符號兩種,比如常用的32位整形可以分為:i32 和 u32 分別代表32位有符號 和 無符號 整形。rust 支援型別推導譬如下面的程式碼,var1 會被推導成 i32型別

let var1 = 32;

但你也只可以指定型別,常用的方式有兩種,如下

let var1 :i16 = 32; //直接指定型別 let var1 = 32i16; //通過後綴指定

浮點

浮點和整數使用是類似。

let f1 = 123。0f64; let f2 = 0。1f64; let f3 = 0。1f32;

這裡補充一點,就是型別轉換,rust裡面經常會看到透過 as 的方式進行型別轉換,如下將i8 型別轉換為 i16,由於 i16 比 i8 容量大,轉換是安全的。

let var1 : i8 = 41; let var2 : i16 = var1 as i16;

元組

第一次接觸元組型別是在Python,rust 裡面也支援元組型別,元組就是用括號把不同的型別組合起來。比如下面 a 就是一個元組型別

let a = (1i32, false);

其實go 的返回值也可以認為是一種元組,只不過go 沒有明確這個型別。元組之中還可以巢狀元組

let b = (“a”, (1i32, 2i32));

結構體

無論是c/c++ 還是go 都支援結構體。如下定義了一個座標點,有兩個屬性分別是 x 和 y 。

struct Point { x: i32, y: i32,}

後續我們就可以對結構體例項化,建立一個結構體”例項“。

fn main() { let p = Point { x: 0, y: 0}; println!(“Point is at {} {}”, p。x, p。y);}

這個和其他語言也沒有啥區別。我們還可以給結構體新增方法,這個後面再說。

元組結構體

它是元組和結構體的雜交。定義像結構體,但大括號改成了小括號,屬性都是匿名。

struct Color(i32, i32, i32);struct Point(i32, i32, i32);

後續也可以例項化使用

fn main() { let p = Point( 1, 2, 3); println!(“Point is at {} {} {}”, p。0, p。1,p。2);}

列舉

rust 列舉也沒有什麼特殊的,只不過型別定義不是透過 ”:“ 改成了小括號

enum Number { Int(i32), Float(f32),}

列舉主要用於match 分支判斷,匹配對應的型別。

fn read_num(num: Number) { match num { Number::Int(value) => println!(“Integer {}”, value), Number::Float(value) => println!(“Float {}”, value), }}fn main() { let n: Number = Number::Int(1); read_num(n);}

陣列

陣列主要是儲存一組相同型別的資料集合,可以透過如下兩種方式

let arr: [i32; 3] = [1, 2, 3]; //指定陣列元素型別是i32,長度為3 let init_arr = [0; 10]; //初始化長度為10,每個元素都為0

我們還可以從陣列中生成切片,go裡面是透過”:“切割,而rust 是透過 ”。。“,比如

&arr[1。。] //[2, 3]

總結一下,rust 裡面除了 元組結構體以外,和其他程式語言相比,並沒有引入新概念。到這裡還是比較容易學習的。