Rust 使用包含借用参数的结构

Rust 使用包含借用参数的结构,rust,lifetime,borrow-checker,Rust,Lifetime,Borrow Checker,我正在用Rust编写一个简单的游戏,其中包括一个抽屉,它构造一次,然后作为可变引用通过许多方法: pub struct Drawer<'a> { // ... renderer: Renderer<'a>, // ... } fn pause(drawer: &mut Drawer, events: &[Event]) { // ... drawer.draw_text(&TextPos::Centered

我正在用Rust编写一个简单的游戏,其中包括一个抽屉,它构造一次,然后作为可变引用通过许多方法:

pub struct Drawer<'a> {
    // ...
    renderer: Renderer<'a>,
    // ...
}

fn pause(drawer: &mut Drawer, events: &[Event]) {
    // ...
    drawer.draw_text(&TextPos::Centered, "Paused", 1);
    // ...
}
为此,我创建了一个TextDrawer结构,其中包含对抽屉的引用:

我认为我在结构上的生命周期是正确的,引用必须和抽屉本身一样长

但是,在添加显式生存期之前,我的文本方法不会编译。当我这样做时,每个调用文本的方法都需要显式的生命周期,等等。我很惊讶这些生命周期必须被说明:毕竟,它们都是fn foo的形式多亏了上面Lukas所做的,我意识到我只是把我的文本方法的生命周期参数倒过来了

我不正确的一生:

impl<'a> Drawer<'a> {
    pub fn text<'b>(&'b mut self) -> TextDrawer<'a, 'b> {
        // omitted
    }
}
impl<'a> Drawer<'a> {
    pub fn text<'b>(&'b mut self) -> TextDrawer<'b, 'a> {
        // omitted
    }
}
正确的生命周期:

impl<'a> Drawer<'a> {
    pub fn text<'b>(&'b mut self) -> TextDrawer<'a, 'b> {
        // omitted
    }
}
impl<'a> Drawer<'a> {
    pub fn text<'b>(&'b mut self) -> TextDrawer<'b, 'a> {
        // omitted
    }
}

此后,所有的编译都没有任何明确的生命周期。

与您的问题无关,但您可能希望考虑将抽屉改名为没有更常见的第二含义的东西。至少,假设它的发音是/drɔər/而不是/dror/你能发布你的错误吗?您发布的内容看起来无法编译。TextDrawer的返回可能推断了错误的界限,但我不清楚。抽屉:&'a mutDrawer@bluejekyll您的上一条语句是错误的:您不能通过&mut&t可变引用将任何内容更改为不可变引用。所以里面的可变引用是有意义的,除非我在这里遗漏了一些关键的东西。我在文本方法中添加了生命周期参数,它成功了。例如,我不需要向pause函数添加生存期参数,这仍然有效。菲利克斯,你能更详细地解释一下你的最后一段话吗?可能有代码和错误消息?如果我的链接解决方案已经有帮助,请让我知道-我会给你一个答案。你似乎是正确的,它没有错,但根据你的例子,它看起来确实没有必要。谢谢你纠正我。