字串#
- 我發現 Rust 字串跟我 JavaScript 的差別好大!!不能用一個語言的思維去學所有語言。
String
是一個Vec<u8>
的封裝,不是一個真的字串!
- 創建一個字串
`String::new`用來創建空字串實例,沒有參數
let mut s =String::new();
`String::from`用來創建字串實例,使用&str類型當作參數
let mut ss=String::from("我是rust");
// 等價
let mut ss="我是rust".to_string();
我看編輯器返回的類型都一樣,所以說日常使用裡面想用哪個用哪個。
- 常用的字串操作
// 返回字串長度
ss.len(); // 10
// 返回字串是否為空
ss.is_empyt(); // false
// 字串轉成位元組值
ss.into_bytes(); // [230, 136, 145, 230, 152, 175, 114, 117, 115, 116, 229, 164, 169, 228, 184, 139, 230, 151, 160, 230, 149, 140]
// 小寫
ss.to_lowercase(); // 我是rust
// 大寫
ss.to_uppercase();// 我是RUST
// 返回刪除了前後空格的字串片
ss.trim();// 我是rust
// 字串片解析為其他類型
let num:u32 = "22".parse().unwarp();
// 追加字串 接收一個&str類型
ss.push_str("天下無敵"); // 我是rust天下無敵
// 文字佔用了3個位元組,所以會報錯,使用字母的時候正常
// 假如ss值為rust
ss.insert_str(1,"天下無敵"); // r天下無敵ust
// 匹配是否包含參數值
ss.contains("r") // true
// 匹配開頭是否包含參數值
ss.start_with("我") // true
// 匹配結尾是否包含參數值
ss.end_with("t") // true
// 匹配位元組的索引值
ss.find("r") // Some(6)
// 字串替換
ss.replace("rust", "c++") // 我是c++
數值#
整型#
有無符號的區別是能否為負值
- 可能為負數的值用有符號的類型
- 永遠是正數的值用無符號的類型
長度 | 有符號 | 無符號 |
---|---|---|
8 | i8 | u8 |
16 | i16 | u16 |
32 | i32 | u32 |
64 | i64 | u64 |
128 | i128 | u128 |
arch | isize | usize |
浮點型#
f32
和f64
rust 預設浮點類型為 ****f64**
一些簡單運算及自帶方法#
let sum = 99 + 1; // 100
let difference = 100 - 1; // 99
let multip = 4 * 30; // 120
let div = 6 / 3; // 2
let truncated = -6 / 3; // -2
let remainder = 43 % 5; // 3
// 絕對值
(-10i32).abs(); // 10
// 絕對差值
(-10i32).abs_diff(5); // 15
布林#
跟其他語言沒什麼區別
元組#
使用場景
- 函數的參數傳遞
- 返回值類型
let tuple = (5, "Rust", true);
// 存取
let number = tuple.0; // 5
let student_tuple = ("RR", 100);
fn tuple_match((name,score):(&str,u32))-> String{
match score{
90..=100 => format!("在{}課程中表現出色,成績為{},優秀!",
80..=89 => format!("在{}課程中表現良好,成績為{},良好!", course_name, score),
70..=79 => format!("在{}課程中表現一般,成績為{},及格!", course_name, score),
_ => format!("在{}課程中需要努力,成績為{},不及格。", course_name, score),
}
}
tuple_match(student_tuple) // RR在課程中表現出色,成績為100,優秀!
陣列#
Array#
- 固定長度的元素集合,且類型需統一。
- 不支持新增,刪除操作。
let mut numbers: [i32; 5] = [1, 2, 3, 4, 5];
// 存取陣列元素
println!("第一個元素: {}", numbers[0]);
println!("最後一個元素: {}", numbers[4]);
// 修改陣列中的元素
numbers[2] = 20;
println!("修改後的第三個元素: {}", numbers[2]);
// 遍歷陣列
for elem in numbers.iter() {
println!("{}", elem);
}
// 使用陣列字面量創建陣列
let array_literal: [i32; 6] = [0; 6];
println!("使用字面量初始化的陣列: {:?}", array_literal);
Vec#
- 動態大小的元素集合
- 支持新增,刪除操作。
let mut vec: Vec<i32> = Vec::new();
vec.push(1);
vec.push(2);
vec.push(3);
// 等價
let mut vec = vec![1,2,3];
// 等價
let mut vec = Vec::from([1, 2, 3]);
vec.len(); // 2
// 彈出末尾元素值
vec.pop(); // Some(2)
// 新增
vec.push(99); // [1,2,3,99]
// 根據索引刪除值
vec.remove(0); // [2,3]
// 匹配值
vec.contains(&3); // true
// 排序
vec!["hello", "world"].join(" "); // hello world
vec.sort(); // [1,2,3]
// 切片,返回對切片元素的迭代器
let mut chunks= vec.chunks(2);
chunks.next().unwrap(); // &[1,2]
chunks.next().unwrap(); // &[3]
// 存取
println!("第一個元素: {}", vec[0]);
println!("最後一個元素: {}", vec[2]);
// 遍歷
for i in vec{
println!("使用字面量初始化的陣列: {}", i);
}