Rust 为什么';在生命周期注释的impl块中的构造函数中创建借来的值是否足够长?

Rust 为什么';在生命周期注释的impl块中的构造函数中创建借来的值是否足够长?,rust,Rust,我正在建立一个学习生锈的小程序。我想做一条蛇 蛇由蛇的部分组成。这些蛇形部分的工作方式类似于链表,每个蛇形部分都知道哪个蛇形部分是前一个蛇形部分。蛇自己知道它的头和尾巴在哪里。看起来是这样的: pub-struct-Snake{ x:f32, y:f32, 上一部分:选项>, } 然而,我在编写Snake构造函数时遇到了问题。到目前为止,我有: impl{ pub fn new(x:f32,y:f32)->Snake=SnakePart::new(x,y); 蛇{ 头:&蛇形部分, 尾巴:&蛇

我正在建立一个学习生锈的小程序。我想做一条蛇

蛇由蛇的部分组成。这些蛇形部分的工作方式类似于链表,每个蛇形部分都知道哪个蛇形部分是前一个蛇形部分。蛇自己知道它的头和尾巴在哪里。看起来是这样的:

pub-struct-Snake{
x:f32,
y:f32,
上一部分:选项>,
}
然而,我在编写Snake构造函数时遇到了问题。到目前为止,我有:

impl{
pub fn new(x:f32,y:f32)->Snake=SnakePart::new(x,y);
蛇{
头:&蛇形部分,
尾巴:&蛇的部分,
当前_角:0。,
}
}
}
这创造了一条蛇,它只有一个部分(或蛇的一部分),它的尾巴和头部。然而,这并不编译。编译器告诉我,
snake\u part
只存在于构造函数的末尾,它必须存在于
impl
块上定义的
'a
生命周期中

我知道它必须和整条蛇一样长寿,但为什么这不起作用呢?我会认为蛇的部分会活下来,而蛇本身也会活下来——我返回的蛇有生命
'a
。我怎样才能说服铁锈让蛇的部分活得足够长呢


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

pub struct Snake>,
}
恳求{
设snake_part:SnakePart>=Vec::具有_容量(1);
蛇形零件。推(蛇形零件);
蛇{
头部:&蛇形部分[0],
尾部:&蛇形部分[0],
蛇形零件:蛇形零件,
当前_角:0。,
}
}

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

我最终使用Vec作为一种链表,所以我不必实现自己的。如果您正在阅读本文,我强烈建议您按照@Jmb的建议阅读

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

我只是这样做了,当移动蛇时,从
snake\u body
中弹出
pop
push

pub-struct-Snake{
///蛇身。最后一项是头部,第一项是尾部。
蛇身:Vec,
}
结构蛇形零件{
x:f32,
y:f32,
}

我最终使用Vec作为一种链表,所以我不必实现自己的。如果您正在阅读本文,我强烈建议您按照@Jmb的建议阅读

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

我只是这样做了,当移动蛇时,从
snake\u body
中弹出
pop
push

pub-struct-Snake{
///蛇身。最后一项是头部,第一项是尾部。
蛇身:Vec,
}
结构蛇形零件{
x:f32,
y:f32,
}

我建议您阅读我在试图找出错误的地方时发现了这个,但我没有开始阅读它。我想我现在要学习了。谢谢您正在将它们包装到
结构中,但基本上仍然试图返回对局部变量的引用,这是没有意义的。另请参阅第二部分。感谢链接。这是我想从答案中强调的一点:“生存期是一种元数据,它允许您和编译器知道值在其当前内存位置的有效时间。这是一个重要的区别,因为这是Rust新手经常犯的错误。Rust生存期不是对象创建和销毁之间的时间段!”我建议你阅读我在试图找出错误的地方时发现了这个,但我没有开始阅读。我想我现在会研究它。谢谢!可能是重复的,你正在将它们包装在一个
结构中,但基本上仍然试图返回对本地的引用,这是没有意义的。另请参阅第二部分。Tha链接的nks。这是我想从答案中强调的:“生存期是一种元数据,它允许您和编译器知道值在其当前内存位置的有效时间。这是一个重要的区别,因为这是Rust新手经常犯的错误。Rust生存期不是对象创建和销毁之间的时间段!”