存储在堆内存上的数据,运行时可以动态变大或者变小。
Vec 特性:
fn main() { // Vec::new() let v: Vec = Vec::new(); // 使用初始值创建,使用 vec! 宏 let v1 = vec![1,2,3]; } fn main() { //这里不需要指明 vec 的类型,因为后面有 push 操作会自己推断出来 let mut v = Vec::new(); v.push(1); } 和其他的 struct 结构体一样,当 Vector 离开了作用域,就会被清理掉
如果涉及到引用会不一样。
fn main() { let v = vec![1,2,3,4,5]; let third = &v[2]; // 1. 使用索引,非法访问 panic println!("{}", third); match v.get(2) { // 2. get 方法,非法访问 返回 None Some(third) => println!("get {}", third), None => println!("not exist"), } } 不能在同一作用域里,对一个值不能同时有可变和不可变的引用
//vec 中内存中是连续的,新增的时候可能会重新分配,所以直接不让这样操作 fn main() { let mut v = vec![1,2,3,4,5]; let third = &v[2]; //不可变的 v.push(6); //mutable borrow occurs here println!("{}", third); } fn main() { let mut v = vec![1,2,3,4,5]; for i in &mut v { *i += 50; } for i in v { println!("{}", i); } } enum Cell { Int(i32), Float(f64), Text(String), } // 因为类型不同,枚举的时候不好操作(很多个),需要使用到 trait 对象 fn main() { //编译时就知道堆上要多大的内存,而且知道所有的可能情况,编译时可以做检查 let row = vec![ Cell::Int(3), Cell::Float(10.1), Cell::Text(String::from("text")), ]; } Rust 的核心语言层面,只有一个字符串类型:字符串切片 str(或&str)
字符串切片:对存储在其他地方、UTF-8编码的字符串的引用
String 类型:
String 和 &str
String::new()//用于创建一个空的字符串,是可变的 to_string() //方法,可用于实现了 displag trait 的类型,包括字符串字面值 String::from() //函数,从字面值来创建字符串 fn main() { let mut s1 = String::from("foo"); s1.push_str("bar");//- push_str() 方法:字符串切片 println!("{}", s1); // foobar s1.push('b');//- push() 方法:单个字符 println!("{}", s1); // foobarb } fn main() { let s1 = String::from("foo"); let s2: String = String::from("bar"); let s3 = s1 + &s2; //相当于 fn add(self, s: &str) -> String {} //&String 强制转换成 &str,解引用强制转换(deref coercion),会保留 s2 的所有权 println!("{}", s3); // println!("{}", s1);//error[E0382]: borrow of moved value: `s1` // println!("{}", s2); } use std::fmt::format; fn main() { let s1 = String::from("foo"); let s2: String = String::from("bar"); let s3: String = String::from("car"); // let s4 = s1 + "-" + &s2 + "-" + &s3; // println!("{}", s4); //foo-bar-car let s5 = format!("{}-{}-{}", s1, s2, s3); println!("{}", s5);//foo-bar-car } String::from("hola").len(); //4,返回字节数 // unicode 标量值 fn main() { let w = "测试一下"; for b in w.bytes() {//字节 print!("{} ", b)//230 181 139 232 175 149 228 184 128 228 184 139 } for b in w.chars() {//标量值 print!("{} ", b)// 测 试 一 下 } } s = &hello[0..4]; //但是切割必须沿着字符的边界切割,否则会panic use std::collections::HashMap; fn main() { //创建 HashMap let mut scores = HashMap::new(); scores.insert(String::from("bob"), 99); //会基于此推断 k,v的类型 // 不在 Prelude 中,所以需要添加 use //2. collect() let team = vec![String::from("a"), String::from("b")]; let t_scores = vec![10,12]; let hp: HashMap<_, _> = team.iter().zip(t_scores.iter()).collect(); // 需要指明 HashMap<_, _> } fn main() { let name = String::from("key"); let value = String::from("value"); //创建 HashMap let mut scores = HashMap::new(); // scores.insert(name, value); // print!("{}:{}", name, value); // value borrowed here after move scores.insert(&name, &value); println!("{}:{}", name, value);//key:value } use std::collections::HashMap; fn main() { //创建 HashMap let mut scores = HashMap::new(); scores.insert(String::from("bob"), 90); scores.insert(String::from("lili"), 100); let name = String::from("bob"); let score = scores.get(&name); match score { Some(s) => println!("{}", s), // 90 None => println!("team not exist"), }; } use std::collections::HashMap; fn main() { //创建 HashMap let mut scores = HashMap::new(); scores.insert(String::from("bob"), 90); scores.insert(String::from("lili"), 100); for (k, v) in &scores { println!("{}-{}", k, v)//lili-100 bob-90 } } use std::collections::HashMap; fn main() { //创建 HashMap let mut scores = HashMap::new(); scores.insert(String::from("bob"), 90); scores.insert(String::from("lili"), 100); //1. 替换现有的 v,插入两个相同k,不同 v,前者会被后者替换 //2. 只在 K 不存在时,才插入 v //使用 entry 方法,结合 or_insert scores.entry(String::from("bob")).or_insert(80); scores.entry(String::from("bob2")).or_insert(80); println!("{:#?}", scores) }
上一篇:idea使用free流程,2024idea、2023idea都可以安装免费使用
下一篇:portableapps banner-PortableApps:让你的电脑装上魔法翅膀,随时随地带着最爱软件飞翔