文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

聊聊Rust中的“借用”

2024-11-29 23:41

关注

借用基础操作

来看看这行代码:

let y = &x;

这里,y就是一个指向x的引用,就像你跟朋友说:“嘿,借你那5块钱瞅瞅。”要查看y指向的值,得用解引用运算符,就像这样:

assert_eq!(5, *y);

就像借来的钱终究要还,引用离开作用域后,它指向的数据依然安好无恙。

函数中的借用

比如,我们要计算字符串s1的长度,但又不想转让所有权,怎么办?用引用传参呗!

fn calculate_length(s: &String) -> usize {
   s.len()
}

在main函数里,我们这么用:

let s1 = String::from("hello");
let len = calculate_length(&s1);
println!("The length of '{}' is {}.", s1, len);

瞧见没,s1的引用被传递给了calculate_length函数,既测了长度,又没动人家的奶酪,多和谐!

可变引用:想要改一改?

不过,要是想修改借用的东西,就像你不仅想牵牵手还想给妹子一个拥抱,那就得用可变引用了,得这么写:

fn change(some_string: &mut String) {
   some_string.push_str(", world");
}

记得,被借用的变量也得是可变的,就像这样初始化:

let mut s = String::from("hello");
change(&mut s);

这下,你的“hello”就能变成“hello, world”了。

可变引用的限制

但别太贪心,Rust规定,在同一时间,对于同一个数据,只能有一个可变引用存在。比如这段代码就会报错:

let mut s = String::from("hello");
let r1 = &mut s;
let r2 = &mut s; // 这里会报错

为啥?因为Rust的borrow checker(借用检查器)在盯着呢,它绝不允许数据竞争这种危险的事情发生,那可是软件bug的大户。

大括号:作用域的艺术

遇到借用冲突,别急,大括号是你的解药。它能帮你控制变量的作用域,这样就能巧妙避开借用检查器的红线:

{
   let r1 = &mut s;
} // r1的生命到此为止
let r2 = &mut s; // 现在可以再创建一个可变引用了

总结一下

怎么样,是不是觉得Rust的借用机制既严格又贴心?这都是为了咱们程序的安全和稳定啊!

来源:科学随想录内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯