我正在尝试在特定类型的新向量上设置生命周期。我理解生命和借用。那不是问题。问题是将生命周期设置为<'a>.
我不断得到关于矢量不能长寿的错误,但是当我尝试设置生命周期时,我得到了一个不同的错误。这是我的代码的样子。
#[derive(Clone, Copy, Debug)]
pub struct ProfessorGroup<'a> {
name: &'a str,
gender: Gender,
professors: &'a Vec<Professor<'a>>,
rank: ProfessorRank,
attrition_rate:f64,
promotion_rate:f64,
hiring_rate:f64,
current_number:i32,
}
impl<'a> Default for ProfessorGroup<'a>{
fn default() -> ProfessorGroup<'a>{
ProfessorGroup {
name: "uninitialized group",
gender: Gender::Female,
professors:&mut Vec<'a>::<Professor<'a>>::new(),//PROBLEM CODE
rank: ProfessorRank::Assistant,
attrition_rate: 0.0,
promotion_rate: 0.0,
hiring_rate: 0.0,
current_number: 0,
}
}
}
我得到的错误是:
error: expected `:`, found `>`
--> src/Actors/ProfessorGroups.rs:21:35
|
21 | professors:&mut Vec<'a>::<Professor<'a>>::new(),
| ^
error[E0063]: missing fields `attrition_rate`, `current_number`, `hiring_rate` and 3 other fields in initializer of `Actors::ProfessorGroups::ProfessorGroup<'_>`
错误似乎会导致访问以下字段 - 因此缺少字段注释。
我尝试了professors:&mut <'a>Vec::<Professor<'a>>::new(),
但是也出现了同样的错误。
我完全取出了这一生professors:&mut Vec::<Professor<'a>>::new(),
,但这只是给了我一个错误,即载体的寿命不够长。
我查看了文档,但我发现的最接近的是这样的,但也没有用:https://users.rust-lang.org/t/why-cant-i-specify-type-parameters-directly-after-the-type/2365
任何人都可以看到我在语法中出错的地方吗?
答案 0 :(得分:3)
减少,你最终会得到像
这样的东西struct Professor<'a>(&'a u8);
pub struct ProfessorGroup<'a> {
professors: &'a Vec<Professor<'a>>,
}
impl<'a> Default for ProfessorGroup<'a> {
fn default() -> ProfessorGroup<'a> {
ProfessorGroup {
professors: &mut Vec<'a>::<Professor<'a>>::new(),
}
}
}
按顺序:
Vec
,而不是&Vec
。此外,您希望&mut value
与&mut Type
和&value
与&Type
相匹配,请勿跨越它们。<'a>
以获取:Vec::<Professor<'a>>::new()
。这个编译。Vec::new()
。 Vec
也会实现Default
本身,因此对于这个小例子,您可以#[derive(Default)]
。如果有意义,您可以为所有组件类型实现(或派生)Default
。
我了解生命和借用。那不是问题。
由于这部分内容,您可能希望重新评估您对此声明的信心:
professors: &mut Vec<'a>::<Professor<'a>>::new()
// ^^^^
你cannot return a reference to a value created in a function,没有例外。一生都会阻止这种情况。
您还应该查看如何创建Minimal, Complete, Verifiable Example。在这种情况下,为什么你的 8个字段与你的问题无关?你为什么不分享你所包括的所有类型的定义?在尝试理解任何编程问题时,请将其减少直到问题仍然存在。