1.引用与借用
在上一章节最后的代码中, 我们必须将 String
返回给调用函数,以便在调用 calculate_length
后仍能使用 String
,因为 String
被移动到了 calculate_length
内。相反我们可以提供一个 String
值的引用(reference)。引用(reference)像一个指针,因为它是一个地址,我们可以由此访问储存于该地址的属于其他变量的数据。 与指针不同,引用确保指向某个特定类型的有效值。
下面是如何定义并使用一个(新的)calculate_length
函数,它以一个对象的引用作为参数而不是获取值的所有权:
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
给 calculate_length
,同时在函数定义中,我们获取 &String
而不是 String
。这些 & 符号就是 引用,它们允许你使用值但不获取其所有权。
下面是&String s指向String s1的示意图:
仔细看看这个函数调用:
let s1 = String::from("hello");
let len = calculate_length(&s1);
&s1
语法让我们创建一个 指向 值 s1
的引用,但是并不拥有它。因为并不拥有这个值,所以当引用停止使用时,它所