在生命中,我是否遗漏了一些东西?

时间:2017-07-02 15:46:50

标签: rust

我刚开始学习Rust,来自Java / JavaScript背景,所以请耐心等待,因为我对生命时间的理解显然缺少了一些东西。

fn main() {
    struct Appearance<'a> {
        identity:       &'a u64, 
        role:           &'a str
    };
    impl<'a> PartialEq for Appearance<'a> {
        fn eq(&self, other: &Appearance) -> bool {
            self.identity == other.identity && self.role == other.role
        }
    };
    let thing = 42u64;
    let hair_color = "hair color";
    let appearance = Appearance { 
        identity: &thing, 
        role: &hair_color 
    };
    let another_thing = 43u64;    
    let other_appearance = Appearance { 
        identity: &another_thing, 
        role: &hair_color 
    };
    println!("{}", appearance == other_appearance);
}

当编译器到达other_appearance时,这给了我一个编译错误,告诉我another_thing的活动时间不够长。但是,如果我省略other_appearance的创建,程序编译并运行正常。为什么我会收到此错误?

2 个答案:

答案 0 :(得分:5)

PartialEq trait有一个type参数,指定右侧的类型。由于您没有指定它,因此默认为与左侧相同的类型。这意味着假设双方的生命周期相同。 这会导致错误,因为another_thingappearance之前被删除,但other_appearance(其中包含对another_thing的引用)与appearance具有相同的生命周期

您可以通过在右侧使用不同的生命周期来解决此问题:

impl<'a, 'b> PartialEq<Appearance<'b>> for Appearance<'a> {
    fn eq(&self, other: &Appearance<'b>) -> bool {
        self.identity == other.identity && self.role == other.role
    }
};

答案 1 :(得分:1)

当与==语法糖结合使用时,这似乎是终生推理/方差的问题 - 请注意,用PartialEq::eq(&appearance, &other_appearance)替换比较有效。我不知道这是否是一个已知的错误。