【问题标题】:Defining Expected Lifetimes while implementing Traits在实施特征时定义预期寿命
【发布时间】:2020-10-07 04:15:42
【问题描述】:

我正在尝试为结构实现类似特征的“setter”。请看下面的代码:

struct Buffer<'a>{
    data: &'a i32
}

trait Setter {
    fn set_value(& mut self, c: & i32) -> ();
}

impl<'b> Setter for Buffer<'b> {
    fn set_value(& mut self, c: & i32) -> () {
        self.data = c;
    }
}

代码非常简单,set_value 函数所做的只是将 data 设置为等于 c

当我尝试编译代码时,它无法以“引用的生命周期超过借用内容的生命周期”进行编译,我明白为什么会发生这种情况。实现子句的生命周期和函数本身的生命周期是有区别的。

我的问题是如何克服这个问题?我试图定义 set_value 的生命周期应该超过生命周期 'b 但随后我开始陷入特征签名和实际实现之间的问题。

【问题讨论】:

    标签: rust


    【解决方案1】:

    这些生命周期需要更深入地渗透到您的实现中,如下所示:

    struct Buffer<'a>{
        data: &'a i32
    }
    
    trait Setter<'b> {
        fn set_value(&'b mut self, c: &'b i32) -> ();
    }
    
    impl<'b> Setter<'b> for Buffer<'b> {
        fn set_value(&'b mut self, c: &'b i32) -> () {
            self.data = c;
        }
    }
    

    这里的意思是“Buffer 的生命周期不会超过给定的 c 的生命周期”。

    【讨论】:

    • 谢谢!这行得通。 “Buffer的生命周期不会超过给定的c的生命周期”是通过在set_value函数中为“self”和c设置相同的生命周期来表达的吗?如果是这样,为什么我们需要在 trait 内部和 trait 的实现中重复生命周期定义?
    • 通过说它们都具有相同的生命周期,您可以确保 Buffer 不会超过给定的 c 引用。由于函数签名在实现中具有生命周期,因此 trait 也需要包含这些生命周期,以便签名匹配。您可以尝试在此处省略某些内容并查看弹出的各种错误。这似乎有点冗长和笨拙,但 Rust 更喜欢你非常具体地了解这些事情的应用方式。
    猜你喜欢
    • 2018-08-28
    • 2015-11-18
    • 2015-09-30
    • 2023-04-07
    • 2017-07-25
    • 1970-01-01
    • 2021-03-05
    • 2021-02-06
    • 1970-01-01
    相关资源
    最近更新 更多