gpt4 book ai didi

rust - 阐明在函数签名中将两个对不同范围的引用对象的引用绑定(bind)到相同生命周期的含义

转载 作者:行者123 更新时间:2023-11-29 07:44:44 26 4
gpt4 key购买 nike

我一直在努力了解 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() 以便引用没有静态生命周期。该程序正确地打印了 shortHere is the example in the Rust Playground .

如果我们引用 Rustonomicon (我很欣赏这是一个正在进行的文档),我们被告知函数签名的含义如下:

fn as_str<'a>(data: &'a u32) -> &'a str

表示函数:

takes a reference to a u32 with some lifetime, and promises that it can produce a reference to a str that can live just as long.

现在让我们转向我示例中的 min() 的签名:

fn min<'a>(a: &'a str, b: &'a str) -> &'a str

这更受关注,因为:

  • 我们有两个输入引用。
  • 它们的引用对象在不同的​​范围内定义,这意味着它们在不同的生命周期内有效(a 的有效期更长)。

使用与上面引用的语句类似的措辞,min() 的函数签名是什么意思?

  1. 该函数接受两个引用并 promise 生成对 str 的引用,该引用的生命周期与 a 的引用对象一样长 b? 这感觉有点不对,就好像我们从 min() 返回对 b 的引用一样,那么显然该引用在 main() 中的 a 的生命周期内无效。

  2. 该函数接受两个引用并 promise 生成对 str 的引用,该引用可以与 a 的两个引用对象中较短的一个存在一样长> and b? 这可行,因为 ab 的引用在main() 的内部范围。

  3. 完全是别的东西?

总而言之,当它们的引用在调用方的不同范围内定义时,我不明白将 min() 的两个输入引用的生命周期绑定(bind)到相同的生命周期意味着什么。

最佳答案

是 (2):返回的引用与较短的输入生命周期一样长。

但是,从函数的角度来看,两个输入的生命周期实际上是相同的(都是'a)。因此,鉴于 main() 中的变量 a 显然比 b 的生命周期更长,这是如何工作的?

诀窍是调用者缩短了两个引用之一的生命周期以匹配 min() 的函数签名。如果你有一个引用 &'x T,你可以将它转换为 &'y T iff 'x'y(也写作:'x: 'y)长。这符合直觉(我们可以缩短引用的生命周期而不会造成不良后果)。编译器自动执行此转换。所以想象编译器将您的main() 变成:

let a = String::from("short");
{
let b = String::from("a long long long string");

// NOTE: this syntax is not valid Rust!
let a_ref: &'a_in_main str = &a;
let b_ref: &'b_in_main str = &b;
println!("{}", min(&a as &'b_in_main str, &b));
// ^^^^^^^^^^^^^^^^^^
}

这与称为子类型化 的东西有关,您可以在 this excellent answer 中阅读更多相关信息。 .

总结:调用者缩短了一个生命周期以匹配函数签名,这样函数就可以假定两个引用具有相同的生命周期。

关于rust - 阐明在函数签名中将两个对不同范围的引用对象的引用绑定(bind)到相同生命周期的含义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42807679/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com