我一直试图了解 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
表示功能:
对 a 的引用
u32
具有一定的生命周期,并承诺它可以产生对 a 的引用,该引用的生命周期str
也一样长。
现在让我们转向min()
我的示例中的签名:
fn min<'a>(a: &'a str, b: &'a str) -> &'a str
这更受欢迎,因为:
- 我们有两个输入引用。
- 它们的所指对象在不同的范围内定义,这意味着它们在不同的生命周期
a
内有效(有效期更长)。
使用与上面引用的语句类似的措辞,函数签名的min()
含义是什么?
该函数接受两个引用,并承诺产生一个对 a 的引用,该引用可以与和
str
的所指对象一样长。a
b
不知何故感觉不对,好像我们将引用返回到b
from ,那么显然该引用在 inmin()
的生命周期内无效。a
main()
该函数接受两个引用并承诺产生一个对 a 的引用,该引用可以与和
str
的两个引用中较短的一个一样长。a
b
这可能会奏效,因为a
和b
在 的内部范围内都保持有效main()
。完全不同的东西?
总而言之,我不明白min()
当它们的引用在调用者的不同范围内定义时,将两个输入引用的生命周期绑定到同一生命周期意味着什么。