在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; // 现在可以再创建一个可变引用了
怎么样,是不是觉得Rust的借用机制既严格又贴心?这都是为了咱们程序的安全和稳定啊!
本文链接:http://www.28at.com/showinfo-26-85712-0.html聊聊Rust中的“借用”
声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com
上一篇: 秒挂了!与快手无缘了....