Rust中如何在类型参数T实现PartialEq时比较泛型结构体
解决方法
你要的效果在Rust里有两种实现方式,都完全符合「当且仅当内部T实现PartialEq时,Foobar<T>可进行相等比较」的需求,和Vec的行为完全一致:
方式1:派生PartialEq(最常用)
直接给结构体加#[derive(PartialEq)]即可,编译器自动生成的实现会自动为T添加PartialEq约束,不会强制所有泛型实例都支持比较:
#[derive(PartialEq)] struct Foobar<T> { foobar: T } fn x() -> bool { let a = Foobar{foobar: 1}; let b = Foobar{foobar: 2}; a == b }
如果同时需要Eq trait,在派生列表里加上Eq即可,同样只有当T实现Eq时,Foobar<T>才会实现Eq。
方式2:手动实现PartialEq
如果需要自定义比较逻辑,可以手动写trait实现,显式添加T: PartialEq约束即可:
struct Foobar<T> { foobar: T } impl<T: PartialEq> PartialEq for Foobar<T> { fn eq(&self, other: &Self) -> bool { // 这里可以写自定义比较逻辑,默认和派生行为一致直接比较内部字段即可 self.foobar == other.foobar } }
如果需要配套实现Eq,添加如下实现即可:
impl<T: Eq> Eq for Foobar<T> {}
内容的提问来源于stack exchange,提问作者vidstige
相关产品推荐
相关产品推荐

