這篇文章主要就rust的一些比較特殊的基礎概念,如變數、資料型別、控制流等進行簡單的講解。
1、變數
需要提到的是rust是一門專注『安全』,『高效能』的語言,所以在變數的時候以及其他特性上,和其他語言有較大的差異,rust是支援型別推導的,但是預設變數是不可變的。
fn main() ",x);x = 6;
println!("the value of x is: {}",x); // error : cannot assign twice to immutable variable
}
有時候可變性變數是非常有用的,變數只是預設不可變,我們可以使用mut來定義乙個可變性變數。
fn main() ",x);x = 6;
println!("the value of x is: {}",x); // error : cannot assign twice to immutable variable
}
2. 變數和常量的區別
不允許改變值的變數,可能會使你想起另乙個大部分程式語言都有的概念:常量。 類似於不可變變數,但是還是有些區別,首先不允許對常量使用mut,宣告方式使用const,常量可以在任何作用域宣告,且不能被其他變數覆蓋,統一使用大寫。
const max_int:u32 = 1000_000; //rust變數命名規則中使用_可以用來分大寫單詞,並且可以在數字面值中使用提公升閱讀性
fn main() ",max_int);
}
3.字串、元祖、陣列
use std::mem;fn main() {} {}",a.0,a.1,a.2);
// println!("b: {}",b.1); // err 因為這裡的b.1s是個複雜型別(不單一),需要使用另外的佔位符
println!("b: ", b.1);
// 格式化輸出, size_of_val會輸出對應變數的記憶體大小
println!("b petty: {}",b,mem::size_of_val(&b));
// 陣列,注意和訪問元祖的方式不一樣
let xs: [i32;5] = [2,3,4,5,6];
// 預設情況下:32位佔4byte,這裡有5個數佔20byte
println!("{} {} {}",xs[0],xs.len(),mem::size_of_val(&xs));
// 陣列的切片
let xy = &xs[2..4];
println!("xy: ",xy); // 4 5
// let xy1: [i32;2] = xs[2..4]; // err 不能使用值切割,本質上陣列就是字元的切片組合
// 字串和字元
let s = "string"; // 這是字串 &str
let ss = string::from("string");
let s_s = s.to_string();
println!("{} {}",s_s,ss); //string string
let h = string::from("hello, ");
let w = string::from("world");
let hw = h + &w;
println!("hw: {} w:{}",hw, w); // w繼續可用
//let hw1 = h + w; // 編譯不通過,w需要是&str型別
}
4、shadowing(隱藏屬性)
我們可以定義乙個與之前變數同名的新變數,而新變數會隱藏之前的變數,這意味著使用這個變數時始終會看到最後乙個,這也鋪墊了以後我們說rust的所有權概念。
fn main() ",x);let y = ;
println!("the value of y is:{}",y);
}
隱藏與將變數設定為mut是有區別的:
1、乙個變數使用let宣告了後,不小心嘗試對變數重新賦值時,如果沒有使用let,會導致編譯失敗,通過再次使用let宣告我們可以用這個值進行一些計算,返回的還是不可變的變數
2、mut與單單let的另乙個區別是,當再次使用let時,實際上建立了乙個新變數,我們可以改變值型別,但復用這個名字。
fn main() ",spaces); // len: 5// 隱藏使用我們不必使用不同名字,如:spaces_str; spaces_num來表示不同的意思,
let mut spaces_mut = " ";
// spaces_mut = spaces_mut.len(); // mut不能跨型別
spaces_mut = "不能改變型別";
println!("mut_len: {}",spaces_mut);
// mut 使用我們不用再次let,來改變變數的值,但是有個問題不能跨型別
}
在rust中的資料型別
在rust中可以分為兩類型別:標量和復合,我們之前做猜數字的遊戲中使用到了:let guess: u32 = "42".parse().expect("not a number"), 需要指定需要轉換成的型別,由於rust是靜態語言,在編譯前需要知道每個變數的型別。
1、標量型別:
標量(scalar)型別代表乙個單獨的值,rust有四種基本的標量型別: 整型、浮點型、布林和字元型別。
復合型別(compound types)可以將多個值組合成乙個型別,rust有兩個原生的復合型別:元祖和陣列。
fn main() ",tup);// let tup1: (i32;4) = (1,2,3,4); // err:同一型別,多個數量,不能這樣
// println!("the tup1:{}",tup1);
let tup2 = (2,3,4);
let (x,y,_) = tup2; // 必須解構完
println!("the x,y: {} {}",x,y);
println!("the z: {}",tup2.2); // 預設是0開始
}
2、復合型別
多個值的方式是陣列,與元祖不同的是,陣列中的每個元素的型別必須相同。rust的陣列和其他語言不同,它是固定長度的,一旦宣告,長度是不能增加或減少的。當你想要在棧(stack)而不是在堆(heap)上為資料分配空間,或者要確保總是有固定數量的元素時,陣列是非常有用的。但是陣列並不如vector型別靈活。vector型別是標準庫提供的乙個允許增長和縮小長度的類似的陣列的集合型別。當不確定是應該使用陣列還是vector的時候,應該使用vector。
fn main() , b: ",a,b);// 陣列適用場景,比如月份/星期,它是不會變動的
let c = ["january","february","march","april"];
let d = [3;5]; // 5個3
println!("d: 第三個{}",d,d[2]);
}
當發生越界操作時,會發生乙個「rust_baxktace=1"的報錯,發生panic。
Rust 基礎型別
rust 包含以下幾種基礎型別 下面我們就來逐個地進行介紹 布林型別使用bool關鍵字來表示,它僅有兩個值 true和false,這和大多數程式語言都相同 fn main 顯式宣告為bool型別 let is real bool false if is real 字元型別使用char關鍵字來表示,代...
rust中的基礎資料型別
復合型別 rust中的型別注釋 有符號整數主要包括i8 i16 i32 i64 i128和isize 指標大小 無符號整數主要包括u8 u16 u32 u64 u64 u128和usize 指標大小 浮點型資料主要包括f32 f64。字元型資料char,unicode標量值,比如 a b 每乙個字元...
Rust列舉型別
使用enum定義列舉型別。比如,通過 enum 宣告乙個名為 ipaddrkind 的列舉,其包含所有可能的 ip 位址種類 v4 和 v6,在 rust 中 v4 和 v6 這些列舉可能 出現的情況被稱為列舉變體 variant enum ipaddrkind建立列舉型別的例項 let four ...