十三、Rust 借用、Struct、闭包 - 技巧与语法糖

1、引用与借用

  • 不可变的引用,就是借用。

2、可变 + 不可变

  • 不可以同时出现可变 加不可变借用。
  • 以下两种,都是不可以的。
let mut s = String::from("Hello World");
let s3 = &mut s;	// 这里是不可以的
let s1 = &s;
let s2 = &s;
println!("{}, {}, {}", s1, s2, s3);

let mut s = String::from("Hello World");
let s1 = &s;
let s2 = &s;
let s3 = &mut s;
println!("{}, {}, {}", s1, s2, s3);

3、多个可变引用

  • 用花括号,隔离不同作用域,可声明多个可变引用。
let mut s = String::from("Hello World");
{
    let s2 = &mut s;
}
let s3 = &mut s;

4、Struct default 语法

#[derive(Debug, Default)]
pub struct Users {
    pub id: Option<i64>,
    pub username: Option<String>,
    pub password: Option<String>,
    pub email: Option<String>,
    pub created_at: Option<NaiveDateTime>,
    pub updated_at: Option<NaiveDateTime>,
}

let user1 = User {
	username: Some(String::from("小明")),
	password: Some(String::from("123456")),
	..Default::default()
};

5、Struct 更新语法

let email = Some(String::from("xxx@126.com"));
let user2 = User {
	email,
	..user1
};

6、闭包类型转换

let ids = users.into_iter().map(|x| x.id).collect();
let map = users.into_iter().map(|x| (x.id, x)).collect::<HashMap<_, _>>();

7、iter、into_iter、iter_mut

  • iter() - 通过引用遍历项目
  • into_iter() - 遍历项目,将其移至新范围
  • iter_mut() - 遍历项目,为每个项目提供可变的引用
  • https://www.codenong.com/34733811/

8、闭包调用异步方法

use futures::executor::block_on;

pub struct User{
	pub id: Option<i64>,
	pub username: Option<String>,
}

pub async create(user: User) -> i64 {
	// todo save user to DB. return last_insert_id.
}

let user_id = user.id.unwrap_or_else(|| block_on({
    user.password = Some(passhash(&user.password.unwrap()));
    user::bs::create(user)
}));

9、双Vector 一一对应生成map

let teams = vec![String::from("Blue"), String::from("Yellow")];
let intial_scores = vec![10, 50]

let scores: HashMap<_, _> = teams.iter().zip(intial_scores.iter()).collect();
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值