gpt4 book ai didi

rust - 为什么在带生命周期注释的 impl block 中的构造函数中创建时借用的值不能存活足够长的时间?

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

我正在构建一个学习 Rust 的小程序。我正在尝试制作蛇。

蛇由蛇的部分组成。这些蛇部件像链表一样工作,每个蛇部件都知道哪个蛇部件是前一个。蛇本身知道它的头和尾部在哪里。它看起来像这样:

pub struct Snake<'a> {
head: &'a SnakePart<'a>,
tail: &'a SnakePart<'a>,
}

struct SnakePart<'a> {
x: f32,
y: f32,
previous_part: Option<&'a SnakePart<'a>>,
}

但是我在编写 Snake 构造函数时遇到了问题。到目前为止我有这个:

impl<'a> Snake<'a> {
pub fn new(x: f32, y: f32) -> Snake<'a> {
let snake_part: SnakePart<'a> = SnakePart::new(x, y);
Snake {
head: &snake_part,
tail: &snake_part,
current_angle: 0.,
}
}
}

这创建了蛇,它只有一个部分(或蛇的一部分),它既是他的尾部又是他的头。但是,这不会编译。编译器告诉我 snake_part 只存在于构造函数的末尾,并且它必须在 'a 的生命周期内存在 impl block 中定义的.

我知道它必须和整条蛇一样长,但为什么这不起作用?我认为蛇部分会在蛇本身存活时存活 - 我返回的蛇具有生命周期 'a。我怎样才能说服 Rust 让 snake 部分活得足够长?


我试图将所有蛇部分保存到蛇结构本身中。所以我这样改了:

pub struct Snake<'a> {
...
snake_parts: Vec<SnakePart<'a>>,
}

impl<'a> Snake<'a> {
let snake_part: SnakePart<'a> = SnakePart::new(x, y);
let mut snake_parts: Vec<SnakePart<'a>> = Vec::with_capacity(1);
snake_parts.push(snake_part);
Snake {
head: &snake_parts[0],
tail: &snake_parts[0],
snake_parts: snake_parts,
current_angle: 0.,
}
}

为什么这不起作用? (它与前面的代码有完全相同的问题)。我拿蛇部分,把它推到充满蛇部分的向量中,向量本身被保存到蛇中。为什么它的生命周期不够长?

最佳答案

我最终使用 Vec 作为一种链表,所以我不必自己实现。如果您正在阅读本文,我强烈建议您阅读 Learn Rust With Entirely Too Many Linked Lists正如@Jmb 建议的那样。

这个解决方案完全避免了这个问题,所以我不会将这个答案标记为解决方案。解决方案在上面链接的指南中。但是,如果您有类似的问题,可能可以使用与此类似的解决方案来解决您的问题 - 只需使用 Vec,不要自行构建。

我只是在移动蛇时从 snake_body 执行了此操作和 poppush

pub struct Snake {
/// Snake body. The LAST item is head, the FIRST item is tail.
snake_body: Vec<SnakePart>,
}

struct SnakePart {
x: f32,
y: f32,
}

关于rust - 为什么在带生命周期注释的 impl block 中的构造函数中创建时借用的值不能存活足够长的时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56808872/

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