rust 是強類型語言,所有變量、常量都必須有明確的數據類型;很多情況下,省略類型聲明,編譯器可自動推導,但不是所有情況下都會成功。
rust 有整型、浮點型、布爾型、字符型、數組、元組、枚舉、結構體等數據結構,其中:
- 整型有:i8、i16、i32、i64、isize、u8、u16、u32、u64、usize 等
- 其中 isize 在不同硬件架構上編譯的結果不同,如在 x86-64 上為 i64,在x86-32 上則為 i32
- 所有硬件平台的自動推導默認類型均為 i32
- 字面值之間可以添加任意數量的 '_' 提高可讀性,如:123_456_789 與 123456789 等價
- 0xff、0o77、0b11_00 分別是十六進制、八進制、二進制表示法,另 b'A' 表示單字節字符 'A',僅支持 u8 類型
- 浮點型有:f32、f64,自動推導默認類型 f64
一、rust 中的變量值默認是不允許改變的,即不可二次斌值,如下代碼無法通過編譯,需要在變量前添加 mut 標識
fn main() { let zVar: i64 = 0; // let mut zVar: i64 = 0; zVar = 1; println!("{}", zVar); }
二、rust 中可以連續定義同名變量,新的變量將覆蓋舊的變量,且前后的變量類型可以不一致:即 shadowing 特性。
fn main() {
let zvar: i32 = 0;
let zvar: i32 = zvar + 1;
let zvar: i32 = zvar * 2;
let zvar: &str = "Hello World!";
let zvar = zvar.len();
println!("{}", zvar);
}
三、rust 中常量定義必須顯示指明數據類型,同一作用域內不可重名,局部定義覆蓋全局定義。
const GLOB_NUM: f64 = 0.0; // 右值必須符合左值聲明的數據類型,如指定 f64,但右值賦值為 1,則無法通過編譯。 fn main() { let zvar: i32 = 0; let zvar: i32 = zvar + 1; let zvar: i32 = zvar * 2; let zvar: &str = "Hello World!"; let zvar = zvar.len(); const GLOB_NUM: f64 = 1.0; println!("{} {}", zvar, GLOB_NUM); }
四、結構體
fn main() { #[derive(Debug)] struct _T { a: i32, b: u64, } let mut _test = _T {a: 0, b: 0}; // 必須斌值,否則后續無法使用 _test.a = 8; _test.b = 8; println!("{} {}\n{:?}", _test.a, _test.b, _test); }
注:
- 結構體類型定義末尾不加分號 ';'
- 結構體實例定義所有成員變量必須全部初始化
- #[derive(Debug)] 用於啟用調試打印格式
- 允許在函數體內定義局部結構體
五、枚舉
#[derive(Debug)] enum _T { _A(i32), _B(String), _C(i64, u32), _D, _E{x: i32, y: i32}, } impl _T { fn print_self(&self) -> i32 { println!("{:?}", self); 0 } } fn main() { let _var = _T::_D; let _var0 = _T::_E{x: 1, y:2}; _var.print_self(); _var0.print_self(); }
- rust 的枚舉成員可以進一步梆定任意類型數據結構
- 所有成員屬於同一數據類型,方法共享
____
