gpt4 book ai didi

rust - 如何计算函数的输出生命周期?

转载 作者:行者123 更新时间:2023-12-03 11:36:15 25 4
gpt4 key购买 nike

在Rust的书(https://doc.rust-lang.org/book/ch10-03-lifetime-syntax.html)中,此代码用作示例(解释如下):

fn main() {
let string1 = String::from("long string is long");
{
let string2 = String::from("xyz");
let result = longest(string1.as_str(), string2.as_str()); // line 5
println!("The longest string is {}", result); // line 6
}
}

fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
if x.len() > y.len() { x } else { y }
}
我很困惑为什么这些代码都可以编译。
关于 longest函数,该书说:“一般生命周期'a将获得等于x和y生命周期中较小者的具体生命周期”。
然后,这本书说的是 string1.as_str()string2.as_str()分别与 string1string2一样有效。但是为什么他们会呢?这两个引用在第5行之后不再使用,到第6行,它们应该已经失效。当结果不再存在时,为什么在第6行没有错误使用结果?
可以说 result的存在以某种方式延长了输入生命周期,但这与“输出生命周期是输入生命周期的交集”这一观念相矛盾吗?
我在哪里弄错了?

最佳答案

But why would they? These two references were not used after line 5, and by line 6, they should have been dead.


但是他们还没有死。实际上,其中一个绝对在 result中,并将在第6行上使用。引用可以至少持续到当前表达式的末尾(通常但不总是直到分号为止),并且最长可以持续到当前表达式的结尾。它所指向的东西仍然存在。只要 longest在范围内, result输出的lifetime参数就要求它持续存在。值得注意的是, result的范围不大于 string1string2的范围,因此没有问题。如果我们尝试将 longest的结果分配给一个比 string2更长的变量,那么我们会遇到问题。例如,它将无法编译。
fn main() {
let string1 = String::from("long string is long");
let mut result = "";
{
let string2 = String::from("xyz");
result = longest(string1.as_str(), string2.as_str());
}
println!("The longest string is {}", result);
}
因为那将需要 result超过 string2,所以这是一个问题。

关于rust - 如何计算函数的输出生命周期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65964669/

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