聊聊Rust中的“借用”

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

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

在Rust的世界里,想要优雅地共享数据,就得聊聊“借用”这档子事。想象一下,朋友有个宝贝,咱们不夺人所爱,只是暂时借用一下,用完还得物归原主,这就是借用(Borrowing)的核心思想。

借用基础操作

来看看这行代码

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; // 现在可以再创建一个可变引用了

总结一下

  • 借用让代码更简洁,还能避免所有权的频繁转移。
  • 要修改数据,记得用可变引用&mut。
  • 同一时间,一个数据只能被一个可变引用借用,但可以有任意数量的不可变引用。
  • 利用大括号控制作用域,能解决很多借用问题。

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

©本文为清一色官方代发,观点仅代表作者本人,与清一色无关。清一色对文中陈述、观点判断保持中立,不对所包含内容的准确性、可靠性或完整性提供任何明示或暗示的保证。本文不作为投资理财建议,请读者仅作参考,并请自行承担全部责任。文中部分文字/图片/视频/音频等来源于网络,如侵犯到著作权人的权利,请与我们联系(微信/QQ:1074760229)。转载请注明出处:清一色财经

(0)
打赏 微信扫码打赏 微信扫码打赏 支付宝扫码打赏 支付宝扫码打赏
清一色的头像清一色管理团队
上一篇 2024年4月26日 00:06
下一篇 2024年4月26日 00:06

相关推荐

发表评论

登录后才能评论

联系我们

在线咨询:1643011589-QQbutton

手机:13798586780

QQ/微信:1074760229

QQ群:551893940

工作时间:工作日9:00-18:00,节假日休息

关注微信