上节课讲解了切片(Slice)、数组(Array)、向量(Vector)的区别。看到好多同学给我反馈,说可能有点儿晦涩难懂。那我在这里给你们吃一颗定心丸,你们可以先只了解有切片这个定义就可以了。这节课继续讲解一种重要数据类型——字符串(String)。可以这么说,在所有的程序中,大约有80%的代码都是与字符串有关系,所以它很重...
to_string(), 25, true); println!("Name: {}", person.0); println!("Age: {}", person.1); println!("Is employed: {}", person.2); } 2、数组(Array) 数组是一种固定长度的数据结构,它可以存储相同类型的多个值。在Rust中,数组的长度是固定的,且数组的类型由元素类型和长度决定。 以下是一...
let _s: String = String::from("Hello World"); let _hello: &str = &_s[0..5]; let _world: &str = &_s[6..11]; let _hello_string = String::from(_hello); let _world_string = _world.to_string(); 字符串的索引 在JS 中使用索引来范围字符串很正常,但是,但是,但是,Rust 不太...
1、元组(Tuple) 2、数组(Array) 3、字符串(String) 三、自定义数据类型 1、结构体(Struct) 2、枚举(Enum) 四、其他数据类型 1、切片(Slice) 2、Option类型 3、Result类型 总结 导言 Rust是一种现代的、安全的系统编程语言,注重内存安全和并发性。在Rust中,数据类型是程序中最基本的构建块之一。本篇博客将...
"Thor".to_string(), "Loki".to_string(), ]; 现在我们看一下需要在堆上分配数据的情况。此处示例一个在堆上分配了 String 的 Vector,每个字符串使用三个 usize 表示,分别存储着数据地址、容量和长度。在为 Vector 分配的堆内存中,用于存储字符串 header 的数据依次排列,真正用于存储字符串的实际数据会被分...
let names = vec![ "satori".to_string(), "koishi".to_string(), "marisa".to_string(), ]; // names 是分配在堆上的,如果遍历的是 names // 那么遍历结束之后 names 就不能再用了 // 因为在遍历的时候,所有权就已经发生转移了 // 所以我们需要遍历 names.iter() // 因为 names.iter() 获取...
比如String,Vec,HashMap和Box<Trait>/Box<[T]>所有分配都在堆上。 在栈上分配的数据,移动的时候只能是 按位复制的方式。所以即便内存是在栈上分配,也要考虑这个 Copy 的成本。 堆上的数据,要尽可能地避免深拷贝(显式 Clone) 。 并且要尽可能地缓存数据,而避免频繁的内存分配发生。比如可以使用诸如 slab 之...
let str_vec=vec.iter().map(|x| x.to_string()).collect::<Vec<_>>();//这里的str_vec就是一个Vec<String>了 同样filter也可以组合collect使用,得到一个过滤后的集合。 rev rev函数是让迭代器反向迭代,其要求迭代器实现DoubleEndedIterator trait,也就是不能只向前迭代,要能向后迭代才能使用rev函数。
struct MyStruct {field1: i32,field2: String,// ...} 除了以上三种常见的结构体类型,Rust还支持其他特殊类型的结构体,例如带有泛型参数的结构体、具名元组结构体(Named Tuple Struct)和结构体路径(Struct Type Alias)等。 需要注意的是,在Rust中,结构体的分类并不是强制性的,也就是说,一个结构体可以包含任...
PageUnload,// 或者一个元组结构体,KeyPress(char),Paste(String),// 或者一个普通的结构体。Click { x:i64, y:i64} } 访问枚举值 // 方法一:WebEvent::PageLoad// 方法二:useWebEvent::{PageLoad};// or// use WebEvent::*;letxxx= PageLoad;// 等价于 WebEvent::PageLoad ...