基本数据类型
-
Integer types 默认 i32
i8 i16 i32 i64 i128 -
Unsigned Integer Types
u8 u16 u32 u64 u128 -
Platform-Specific Integer Types (平台决定)
usize isize -
Float Types
f32 f64尽量使用f64 ,除非你清楚边界需要的空间 -
Boolean Values
true false -
Character Types
Rust 支持 Unicode 字符; 表示 char 类型使用单引号;
fn main() {
println!("Hello, world!");
// rust_ch1();
_rust_ch2();
}
fn _rust_ch2(){
let a1 = -125;
let a2 = 0xFF;
let a3 = 0o13;
let a4 = 0b10;
println!("{a1},{a2},{a3},{a4}");
//Max Min
println!("u32 max {}",u32::MAX);
println!("u32 min {}",u32::MIN);
println!("i32 max {}",i32::MAX);
println!("i32 min {}",i32::MIN);
println!("uszie max {}",usize::MAX);
println!("iszie max {}",isize::MAX);
println!("iszie is {} bytes",std::mem::size_of<isize>());
println!("uszie is {} bytes",std::mem::size_of::<usize>());
println!("u64 is {} bytes",std::mem::size_of::<u64>());
println!("i64 is {} bytes",std::mem::size_of::<i64>());
}
fn _rust_ch1(){
let x = 5;
println!("1 x {x}");
let x = "hello";
println!("2 x {x}");
let mut x = false;
println!("3 x {x}");
x = true;
println!("4 x {x}");
}
元组、数组、切片
相同点:
- 元组和数组都是 Compound Types, 而 Vec 和 Map 都是 Collection Types
- 元组和数组的长度都是固定的
Tuples 不同类型的数据组成 Arrays 相同类型的数据组成
fn _ch3() {
// tuple
let tup = (0, false, "1", 3.4);
// 使用let解构
let (a, b, c, d) = tup;
println!("a: {}, b: {}, c: {} d: {}", a, b, c, d);
// 模板匹配
match tup {
(a, b, c,d) => {
println!("Name: {}, Age: {}, Height: {} {}", a, b, c,d);
// 输出:Name: true, Age: 30, Height: 5.8
}
};
println!("tup2:{}", tup.2);
//array
let arr = [1, 2, 3, 4, 5, 6, 7];
println!("{}", arr[0]);
// 遍历
for ele in arr {
println!("{ele}");
}
// iter遍历
for (index, &value) in arr.iter().enumerate() {
println!("Element {}: {}", index + 1, value);
}
//切片 : 创建一个包含 my_array 中索引 1 到 3 的元素的切片
let slice: &[i32] = &arr[1..4];
println!("slice: {:?}", slice);
// 输出: my_slice: [2, 3, 4]
for item in slice.iter() {
println!("Item: {}", item);
}
}
数组
数组长度固定,元素类型相同 array
元组
元组是固定长度的异构集合 tuple
切片
切片可以从数组、向量或其他支持切片操作的数据结构中创建。你可以使用 & 符号将数据的引用转换为切片,或者使用 &data[start..end] 的语法来创建一个新的切片。
字符串切片
在 Rust 中,字符串切片是一种特殊类型的切片,通常用 &str 表示。其中 & 表示引用,而 str 表示字符串切片的类型。
字符串切片是对字符串数据的引用,允许你引用字符串中的一部分字符序列,而无需拥有整个字符串的所有权。
字符串切片是 Rust 中处理文本数据的重要工具。
字符串切片可以从字符串字面值、String 类型的字符串或其他字符串切片中创建。你可以使用 & 符号将字符串引用转换为字符串切片,或者通过切片语法 &string[start..end] 来创建一个新的字符串切片。
fn main() {
let string_literal: &str = "Hello, lanyulei!"; // 从字符串字面值创建字符串切片
println!("{}", string_literal);
// 输出:Hello, lanyulei!
let string_data: String = String::from("Rust is great!");
let slice: &str = &string_data; // 从 String 创建字符串切片
println!("{}", slice);
// 输出:Rust is great!
let sub_slice: &str = &slice[0..4]; // 通过切片语法 &string[start..end] 来创建一个新的字符串切片,创建包含 "Rust" 的字符串切片
println!("{}", sub_slice);
// 输出:Rust
}
字符串切片是不可变的,这意味着你不能修改字符串切片中的字符。
字符串的不可变性在 Rust 中是强制执行的,哪怕是使用了 mut 关键字仍然是不可变的,这有助于防止一些常见的编程错误。
fn main() {
let mut string_data: &str = "Hello lanyulei!";
// 下面的代码尝试修改字符串切片中的字符,会导致编译错误
// string_data[0] = 'h'; // 无法编译,因为字符串切片是不可变的
}
你可以使用 .len() 方法获取字符串切片的长度,以及使用迭代器进行字符遍历。
fn main() {
let text: &str = "Rust is great!";
let length: usize = text.len(); // 获取字符串切片的长度
println!("length: {}", length);
// 输出: length: 14
// 使用 `chars` 方法迭代字符串切片中的字符
for c in text.chars() {
println!("Character: {}", c);
}
}
字符串切片与模式匹配结合使用非常有用,允许你根据字符串内容执行不同的操作。
fn main() {
let text: &str = "Rust";
match text {
"Rust" => println!("Found Rust!"),
"Java" => println!("Found Java!"),
_ => println!("Not found"),
}
}
字符串切片在 Rust 中广泛用于文本处理、字符串搜索、解析和分割等操作。由于其不可变性和引用语义,它们是编写安全且高性能的代码的关键组成部分。在处理字符串时,使用字符串切片通常比拥有整个字符串的所有权更高效,因为不需要复制字符串的内容。因此,字符串切片是 Rust 中处理字符串数据的常见选择。
切片的模式匹配
切片可以与模式匹配结合使用,允许你根据切片的内容执行不同的操作。
fn main() {
let data: [i32; 5] = [1, 2, 3, 4, 5];
let slice: &[i32] = &data[1..4];
match slice {
[2, 3, 4] => println!("Matched [2, 3, 4]"),
_ => println!("Not matched"),
}
}
总而言之,切片是 Rust 中用于引用集合部分数据的强大工具,它们允许你在不拥有所有权的情况下有效地操作和处理数据。切片在许多 Rust 代码中都有广泛的应用,特别是在处理字符串和集合数据时。