Rust 为什么不能在结构定义中省略生命期? 结构点{ x:u32, y:u32, } struct Line
定义结构时,没有在结构的生存期和字段的生存期之间建立关系。正如您所指出的,字段中的引用必须比结构活得更长 相反,您所做的是提供一个“通用生命周期”,它将在您创建结构时被专门化。这类似于使用带有类型参数的结构:Rust 为什么不能在结构定义中省略生命期? 结构点{ x:u32, y:u32, } struct Line,rust,lifetime,Rust,Lifetime,定义结构时,没有在结构的生存期和字段的生存期之间建立关系。正如您所指出的,字段中的引用必须比结构活得更长 相反,您所做的是提供一个“通用生命周期”,它将在您创建结构时被专门化。这类似于使用带有类型参数的结构: struct Point { x: u32, y: u32, } struct Line<'a> { start: &'a Point, end: &'a Point, } 在任何情况下,您都不希望此绑定,因此在实现RFC后,
struct Point {
x: u32,
y: u32,
}
struct Line<'a> {
start: &'a Point,
end: &'a Point,
}
在任何情况下,您都不希望此绑定,因此在实现RFC后,您可以说:
struct Foo<'a, T: 'a> {
start: &'a T,
}
struct Foo假设我们有一个行的构造函数
:
struct Foo<'a, T> {
start: &'a T,
}
虽然我认为Rust可能会选择省略结构定义中的生命周期,但现在它没有这样做。您将只看到用于函数/方法的术语生存期省略
。从这个答案中不清楚为什么在声明结构时需要生存期。您是否注意到我添加到问题中的注释?如果我理解你,那么答案是“因为编译器需要它”。如果在结构中有引用,则必须指定这些引用的生存期。结构声明没有生命周期省略,尽管我认为编译器可以为每个生命周期自动放置'a
。要做到这一点,您必须发出一个功能请求,使其自身生锈。@RajV,因为没有它们,没有明显的方法。结构中的非静态引用必然意味着至少应该有一个生存期参数,但可以有更多,这意味着另一件事。@Shepmaster,“结构声明没有生存期省略,尽管我认为编译器可以自动为每个生存期设置一个”。问题恰恰是:为什么编译器不为结构执行生存期省略?这样做似乎是出于生锈的精神,在我看来,这是一个很好的理由。我认为你的答案根本没有解决这个问题,它只提供了显式生命周期声明的示例,所以我很惊讶它被接受。@AxiomaticNexus我个人坚持使用一个生命周期,直到有东西迫使我使用多个生命周期。如果我正在编写一个公开的API,在发布后我会犹豫是否要修改,那么这种情况可能会改变。
struct Foo<'a, T: 'a> {
start: &'a T,
}
struct Foo<'a, T> {
start: &'a T,
}
impl<'a> Line<'a> {
fn new(start: &'a Point, end: &'a Point) -> Line<'a> { // '
Line {
start: start,
end: end,
}
}
}
fn main() {
let mut start = Point { x: 2, y: 4 };
let end = Point { x: 7, y: 10 };
let line = Line::new(&start, &end);
start.x = 3; // error: cannot assign to `start.x` because it is borrowed
}