为什么在我引用的结构上没有使用生命周期?

时间:2017-07-24 12:31:06

标签: rust

以下内容无法编译:

struct Person<'z> {
    street_address: String,
    postcode: String,
    city: String,

    company_name: String,
    position: String,
    annual_income: usize,
}

struct PersonBuilder<'z> {
    person: &'z Person<'z>,
}

impl<'z> PersonBuilder<'z> {
    fn new() -> PersonBuilder<'z> {
        PersonBuilder {
            person: Person {
                street_address: "".to_string(),
                postcode: "".to_string(),
                city: "".to_string(),
                company_name: "".to_string(),
                position: "".to_string(),
                annual_income: 0,
            },
        }
    }
}
error[E0392]: parameter `'z` is never used
 --> src/main.rs:1:15
  |
1 | struct Person<'z> {
  |               ^^ unused type parameter
  |
  = help: consider removing `'z` or using a marker such as `std::marker::PhantomData`

但那不是真的,是吗?我的意思是,PersonBuilder将对某人的引用保留为Person<'z>,当我用PersonBuilder::new()实例化时,显然类型参数可以将两个生命周期联系在一起。那么这里发生了什么?

1 个答案:

答案 0 :(得分:5)

这里的编译器完全正确; 'z上未使用Person。从PersonPersonBuilder

中删除它
struct Person { /* ... */ }

struct PersonBuilder<'z> {
    person: &'z Person,
}

你删除它,你想要做的事情是不可能的。见Is there any way to return a reference to a variable created in a function?。从代码中删除所有生命周期和引用,它将起作用。

  

PersonBuilder保留对某人的引用

是的,那就是&Person

  

Person<'z>

Person<'z>表示Person struct 包含指定生命周期的引用。 &'z Person是对具有指定生命周期的人的引用。

  

使用PersonBuilder::new()实例化它,显然是类型参数

您指的是哪个“类型参数”,因为我在此代码中看不到任何内容。虽然生命周期和类型参数都是泛型的,但它们是不同类型的泛型,并且不会被视为相同。

您可能也对Default特征感兴趣:

#[derive(Debug, Default)]
struct Person { /* ... */ }

impl PersonBuilder {
    fn new() -> PersonBuilder {
        PersonBuilder {
            person: Person::default(),
        }
    }
}