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
}