浅谈rust借用与引用
先来看看rust入门上说的借用与引用:
我们将获取引用作为函数参数称为 借用(borrowing)
正如现实生活中,如果一个人拥有某
样东西,你可以从他那里借来。当你使用完毕,必须还回去。
原文链接:https://blog.csdn.net/weixin_44259356/article/details/103975850
例子
fn main() {
let s1 = String::from("hello");
let len = calculate_length(&s1);
println!("The length of '{}' is {}.", s1, len);
}
fn calculate_length(s: &String) -> usize {
s.len()
}
这里首先创建了一个名字为s1的String,注意不是str,String是可变字符串,由栈里的s1保存指向堆空间的地址,长度以及容量。如上图。
然后调用函数calculate_length,里面传入了一个s1的引用。这里s里存的是s1的引用,也就是说s是一个与s1不同的全新的变量,只是里面存的指针值指向了s1,同时没有长度和容量。这里可以理解为java的引用。
这样做法有一个好处,函数并没有直接获得s1的所有权,当函数结束,即引用离开其作用域s被释放但是s1任然存在并不会被丢弃。所以函数结束后你任然可以继续使用s1.
注意:rust里默认拷贝全是浅拷贝,只会拷贝栈上的引用值,并不会拷贝堆空间的值。
深拷贝可以如下使用:
let s1 = String::from("hello");
let s2 = s1.clone();
最后总结
rust借用可以理解为动作,行为,类比a从b那里借东西。
rust引用类似于java的引用,字面上的:&s1。所以我们称
我们将获取引用作为函数参数称为 借用(borrowing)