我一直在努力理解Rust借用和所有权模型。
假设我们有以下代码:
fn main() {
let a = String::from("short");
{
let b = String::from("a long long long string");
println!("{}", min(&a, &b));
}
}
fn min<'a>(a: &'a str, b: &'a str) -> &'a str {
if a.len() < b.len() {
return a;
} else {
return b;
}
}
min()
函数返回两个 引用 字符串中较短的那个。 main()
函数传入两个字符串引用,它们的定义在不同的作用域内。我使用了 String::from()
以使这些引用没有静态生命周期。该程序正确打印出short
。 这是 Rust Playground 中的示例。如果我们参考Rustonomicon(我很感激它是一个正在进行中的文档),我们可以了解到像下面这样的函数签名的含义:
fn as_str<'a>(data: &'a u32) -> &'a str
意味着该函数:
接受一个的引用,并承诺可以生成一个能够与其相同生命周期的引用。
现在让我们转向我的示例中的min()
签名:
fn min<'a>(a: &'a str, b: &'a str) -> &'a str
这更加复杂,因为:
- 我们有两个输入引用。
- 它们的指向在不同的作用域中定义,这意味着它们的有效期不同(
a
有效时间更长)。
使用与上述引用语类似的措辞,min()
函数签名的意思是什么?
该函数接受两个引用并承诺产生一个到
str
的引用,可以像a
和b
的引用一样长久存在吗?感觉有些不对,如果我们从min()
返回b
的引用,那么该引用显然不能在main()
中a
的生命周期内有效。该函数接受两个引用并承诺产生一个到
str
的引用,可以像a
和b
中较短寿命的引用一样长久存在吗?可能可行,因为a
和b
的两个引用都在main()
的内部作用域中保持有效。完全不同的东西?
总之,我不理解将min()
的两个输入引用的生命周期绑定到相同的生命周期意味着什么,当它们的指向在调用者的不同作用域中定义。