gpt4 book ai didi

rust - `array` 生命周期不够长

转载 作者:行者123 更新时间:2023-11-29 08:33:19 25 4
gpt4 key购买 nike

我想保留一个 Holded 实例,但我不能,因为它在一个数组中。我怎样才能从数组中“提取”这个实例并将其保存在 Object 实例中? (在我的原始代码中,我没有数组,只有迭代器)。这是等效的代码:

struct Holded {
value: u8,
}

struct Holder;

impl Holder {
pub fn get(&self) -> [Holded; 2] {
[Holded { value: 0 }, Holded { value: 1 }]
}
}

struct Object<'a> {
holded: &'a Holded,
}

fn main() {
let holder = Holder;

let obj = work(&holder).unwrap();
println!("{}", obj.holded.value);
}

fn work(holder: &Holder) -> Option<Object> {
let mut obj: Object;
let array = holder.get();

for h in array.into_iter() {
if h.value == 1u8 {
obj = Object { holded: h };
return Some(obj);
}
}

None
}

错误信息:

error: `array` does not live long enough
--> src/main.rs:28:14
|
28 | for h in array.into_iter() {
| ^^^^^ does not live long enough
...
36 | }
| - borrowed value only lives until here
|
note: borrowed value must be valid for the anonymous lifetime #1 defined on the block at 24:43...
--> src/main.rs:24:44
|
24 | fn work(holder: &Holder) -> Option<Object> {
| ^

最佳答案

在您发布的 MCVE 中,Object 结构包含对 Holded 的引用:

struct Object<'a> {
holded: &'a Holded,
}

在函数 work() 中,您返回一个 Object(可选):

fn work(holder: &Holder) -> Option<Object> {

您从按值返回它的函数中获取 Holded:

impl Holder {
pub fn get( &self ) -> [Holded; 2] {
[Holded { value: 0 }, Holded { value: 1 }]
}
}

现在这永远行不通了。如果您返回对 Holded 的引用,则您引用的 Holded 必须存储在某处。这意味着作为函数 work() 的输入或输出。

我重写了您的示例以在 Holder 中包含 Holded。这是解决这个问题的一种方法。但我不确定这是否适用于您原来的问题。

struct Holded {
value: u8,
}

struct Holder{
value: [Holded; 2],
}

impl Holder {
pub fn new() -> Holder {
Holder {value: [Holded { value: 0 }, Holded { value: 1 }] }
}

pub fn get( &self ) -> &[Holded; 2] {
&self.value
}
}

struct Object<'a> {
holded: &'a Holded,
}

fn main() {
let holder = Holder::new();

let obj = work(&holder).unwrap();
println!("{}", obj.holded.value);

let obj = work2(&holder).unwrap();
println!("{}", obj.holded.value);
}

fn work(holder: &Holder) -> Option<Object> {
let obj: Object;
let array = holder.get();

for h in array.into_iter() {
if h.value == 1u8 {
obj = Object { holded: h };
return Some(obj);
}
}

None
}

fn work2(holder: &Holder) -> Option<Object> {
holder.get()
.iter()
.filter(|h| h.value == 1u8)
.map(|h| Object { holded: h })
.next()
}

您注意到我还添加了一种不同的方法来实现 work() 函数 (work2())。

关于rust - `array` 生命周期不够长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41904689/

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