以下内容无法编译:
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()
实例化时,显然类型参数可以将两个生命周期联系在一起。那么这里发生了什么?
答案 0 :(得分:5)
这里的编译器完全正确; 'z
上未使用Person
。从Person
和PersonBuilder
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(),
}
}
}