无法在新的空向量

时间:2017-05-09 16:24:26

标签: vector rust lifetime

我正在尝试在特定类型的新向量上设置生命周期。我理解生命和借用。那不是问题。问题是将生命周期设置为<'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

任何人都可以看到我在语法中出错的地方吗?

1 个答案:

答案 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(), 
        }
    }
}

按顺序:

  1. 如上所述,您无法返回参考。将会员转换为Vec,而不是&Vec。此外,您希望&mut value&mut Type&value&Type相匹配,请勿跨越它们。
  2. 删除第一个<'a>以获取:Vec::<Professor<'a>>::new()。这个编译。
  3. 意识到你不必这样做,因为类型推断的整个要点是减少你告诉编译器的东西数量。您只需输入Vec::new()
  4. 即可

    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个字段与你的问题无关?你为什么不分享你所包括的所有类型的定义?在尝试理解任何编程问题时,请将其减少直到问题仍然存在。