gpt4 book ai didi

rust - "does not live long enough"相同函数错误

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

我希望这段代码能够工作,因为所有绑定(bind)都在同一范围内:

fn main() {
let mut foobar = vec!["foo"];
let bar = "bar".to_string();
foobar.push(&bar);
}

但是我收到了这个错误:

error: `bar` does not live long enough
--> baz.rs:4:18
|>
4 |> foobar.push(&bar);
|> ^^^
note: reference must be valid for the block suffix following statement 0 at 2:33...
--> baz.rs:2:34
|>
2 |> let mut foobar = vec!["foo"];
|> ^
note: ...but borrowed value is only valid for the block suffix following statement 1 at 3:32
--> baz.rs:3:33
|>
3 |> let bar = "bar".to_string();
|> ^

error: aborting due to previous error

最佳答案

在同一 block 中声明的变量按照声明的相反顺序被删除。在您的代码中,barfoobar 之前删除:

fn main() {
let mut foobar = vec!["foo"]; // <---------| 0
let bar = "bar".to_string(); // <--| 1 |
foobar.push(&bar); // | bar | foobar
// <--| |
// <---------|
// In the error message
// 0 is called "block suffix following statement 0", and
// 1 is called "block suffix following statement 1"
}

您正在将 reference 推送到 foobar 中的 bar,因此您必须确保 bar 位于至少与 foobar 一样长。但是因为 bar 是在 foobar 之后声明的,所以 bar 的生命周期实际上比 foobar 短,这意味着foobar 在短时间内包含悬空引用。

要编译代码,在foobar之前声明bar:

fn main() {
let bar = "bar".to_string();
let mut foobar = vec!["foo"];
foobar.push(&bar);
}

或选择加入 non-lexical lifetimes :

#![feature(nll)]

fn main() {
let mut foobar = vec!["foo"];
let bar = "bar".to_string();
foobar.push(&bar);
}

虽然这仍然有一个悬挂引用,但这并不重要,因为删除引用没有任何作用; Vec 在被删除时不需要使用它包含的引用的值。

关于rust - "does not live long enough"相同函数错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38023291/

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