Rust 通過 let 關(guān)鍵字進(jìn)行變量綁定。
fn main() {
let a1 = 5;
let a2:i32 = 5;
assert_eq!(a1, a2);
//let 綁定 整數(shù)變量默認(rèn)類型推斷是 i32
let b1:u32 = 5;
//assert_eq!(a1, b1);
//去掉上面的注釋會報錯,因為類型不匹配
//errer: mismatched types
}
這里的 assert_eq! 宏的作用是判斷兩個參數(shù)是不是相等的,但如果是兩個不匹配的類型,就算字面值相等也會報錯。
rust 在聲明變量時,在變量前面加入 mut 關(guān)鍵字,變量就會成為可變綁定的變量。
fn main() {
let mut a: f64 = 1.0;
let b = 2.0f32;
//改變 a 的綁定
a = 2.0;
println!("{:?}", a);
//重新綁定為不可變
let a = a;
//不能賦值
//a = 3.0;
//類型不匹配
//assert_eq!(a, b);
}
這里的 b 變量,綁定了 2.0f32。這是 Rust 里面值類型顯式標(biāo)記的語法,規(guī)定為value
+type
的形式。
例如: 固定大小類型:
1u8 1i8
1u16 1i16
1u32 1i32
1u64 1i64
可變大小類型:
1usize 1isize
浮點類型:
1f32 1f64
為什么在 Rust 里面聲明一個變量的時候要采用 let 綁定表達(dá)式? 那是因為 let 綁定表達(dá)式的表達(dá)能力更強,而且 let 表達(dá)式實際上是一種模式匹配。
例如:
fn main() {
let (a, mut b): (bool,bool) = (true, false);
println!("a = {:?}, b = {:?}", a, b);
//a 不可變綁定
//a = false;
//b 可變綁定
b = true;
assert_eq!(a, b);
}
這里使用了 bool,只有true和false兩個值,通常用來做邏輯判斷的類型。
Rust內(nèi)置的原生類型 (primitive types) 有以下幾類:
true
和false
。i8
, i16
, i32
, i64
, isize
)、
無符號整數(shù) (u8
, u16
, u32
, u64
, usize
) 以及浮點數(shù) (f32
, f64
)。str
,更常用的是字符串切片&str
和堆分配字符串String
,
其中字符串切片是靜態(tài)分配的,有固定的大小,并且不可變,而堆分配字符串是可變的。[T; N]
。&[T]
。*const T
和*mut T
,但解引用它們是不安全的,必須放到unsafe
塊里。()
,其唯一的值也是()
。// boolean type
let t = true;
let f: bool = false;
// char type
let c = 'c';
// numeric types
let x = 42;
let y: u32 = 123_456;
let z: f64 = 1.23e+2;
let zero = z.abs_sub(123.4);
let bin = 0b1111_0000;
let oct = 0o7320_1546;
let hex = 0xf23a_b049;
// string types
let str = "Hello, world!";
let mut string = str.to_string();
// arrays and slices
let a = [0, 1, 2, 3, 4];
let middle = &a[1..4];
let mut ten_zeros: [i64; 10] = [0; 10];
// tuples
let tuple: (i32, &str) = (50, "hello");
let (fifty, _) = tuple;
let hello = tuple.1;
// raw pointers
let x = 5;
let raw = &x as *const i32;
let points_at = unsafe { *raw };
// functions
fn foo(x: i32) -> i32 { x }
let bar: fn(i32) -> i32 = foo;
有幾點是需要特別注意的:
_
分隔符來增加可讀性。b'H'
以及單字節(jié)字符串b"Hello"
,僅限制于ASCII字符。
此外,還可以使用r#"..."#
標(biāo)記來表示原始字符串,不需要對特殊字符進(jìn)行轉(zhuǎn)義。&
符號將String
類型轉(zhuǎn)換成&str
類型很廉價,
但是使用to_string()
方法將&str
轉(zhuǎn)換到String
類型涉及到分配內(nèi)存,
除非很有必要否則不要這么做。vec!
創(chuàng)建。==
和!=
運算符來判斷是否相同。as
關(guān)鍵字顯式轉(zhuǎn)換。type
關(guān)鍵字定義某個類型的別名,并且應(yīng)該采用駝峰命名法。// explicit conversion
let decimal = 65.4321_f32;
let integer = decimal as u8;
let character = integer as char;
// type aliases
type NanoSecond = u64;
type Point = (u8, u8);