我刚开始学习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
的创建,程序编译并运行正常。为什么我会收到此错误?
答案 0 :(得分:5)
PartialEq
trait有一个type参数,指定右侧的类型。由于您没有指定它,因此默认为与左侧相同的类型。这意味着假设双方的生命周期相同。
这会导致错误,因为another_thing
在appearance
之前被删除,但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)
替换比较有效。我不知道这是否是一个已知的错误。