Rust学习记录(3)

1.所有权与元组的第一次记录

KV 存储 HashMap - Rust语言圣经(Rust Course)

开头有个案例:

fn main() {
    use std::collections::HashMap;

    let teams_list = vec![
        ("中国队".to_string(), 100),
        ("美国队".to_string(), 10),
        ("日本队".to_string(), 50),
    ];

    let mut teams_map = HashMap::new();
    for team in &teams_list {
        teams_map.insert(&team.0, team.1);
    }

    println!("{:?}",teams_map)
}

这里for循环的的team是&(String,i32)类型,元组的借用类型,在使用如team.0,team.1时候,rust会自动解引用。

这个例子也可侧面知道rust会自动解引用元组引用:

use std::collections::HashMap;

fn main() {
    let tuple = ("中国".to_string(),10);
	let a = &tuple;
	println!("{}-{}",a.0,a.1);
	
	let mut hashmap = HashMap::new();
	//hashmap.insert(a.0,a.1);  // 错误

}

注释展开,此代码会报错:move occurs because `a.0` has type `String`, which does not implement the `Copy` trait。将其添加借用&可通过。

use std::collections::HashMap;

fn main() {
    let tuple = ("中国".to_string(),10);
	let a = &tuple;
	println!("{}-{}",a.0,a.1);
	
	let mut hashmap = HashMap::new();
	hashmap.insert(&a.0,a.1);  
}

注意到,insert会发生move,所以当心非copy类的所有权转移问题,案例中a.1是i32类型,可以copy。

另外注意,将引用类型数据放入hashmap中,需要考虑引用数据的生命周期。

2.Option的copied方法和unwrap_or方法

关于unwrap_or方法,如果option<>是None时,unwrap_or返回提供的默认值,如unwrap_or(1)。

关于copied方法,将Option<&T>通过复制(copy)返回Option<T>,即引用类型转为值类型。

在kv中KV 存储 HashMap - Rust语言圣经(Rust Course)

let score: i32 = scores.get(&team_name).copied().unwrap_or(0);    

该语句通过get方法返回一个Option<&i32>类型,经过copied(),转为Option<i32>类型,这样可以使用unwrap_or(0)方法。

另外,上文中:

use std::collections::HashMap;

let mut scores = HashMap::new();

scores.insert(String::from("Blue"), 10);
scores.insert(String::from("Yellow"), 50);

let team_name = String::from("Blue");
let score: Option<&i32> = scores.get(&team_name);

为什么get方法返回Option<&i32>值类型的引用?

解释:1.如果返回i32类型,那么会发生复制,哪怕微小的复制,在大量复制下也会降低性能,所以使用引用,避免内存分配和释放的负担 2.通过返回引用,可以让调用者决定是否需要复制值,是暂时使用值而不获取所有权

3.for迭代在HashMap和Vector中的情况

结果:

iter()等价于“&”(不可变引用迭代)

for i in item.iter() {}
for i in &item {}
//对于iter()返回 std::slice::Iter<'_,T>,迭代器,产生&T类型的引用
//就是这个i的数据类型

iter_mut()等价“&mut ”(可变引用迭代)

for i in item.iter_mut() {}
for i in &mut item {}

into_iter()等价“”(直接迭代、所有权迭代)

for i in item.into_iter() {}
for i in item {}

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值