Trait core::marker::StructuralEq [−][src]
pub trait StructuralEq { }Expand description
模式匹配中使用的常量的必需 trait。
派生 Eq 的任何类型都会自动实现此 trait,无论其类型参数是否实现 Eq。
这是一种解决我们类型系统中的限制的技巧。
Background
我们要要求模式匹配中使用的 const 类型具有属性 #[derive(PartialEq, Eq)]。
在更理想的世界中,我们可以通过仅检查给定类型是否同时实现 StructuralPartialEq trait 和 Eq trait 来检查该要求。
但是,您可能拥有 doderive(PartialEq, Eq) 的 ADT,这是我们希望编译器接受的情况,但是 const 的类型无法实现 Eq。
也就是说,像这样的情况:
#[derive(PartialEq, Eq)]
struct Wrap<X>(X);
fn higher_order(_: &()) { }
const CFN: Wrap<fn(&())> = Wrap(higher_order);
fn main() {
match CFN {
CFN => {}
_ => {}
}
}Run(以上代码中的问题是 Wrap<fn(&())> 既不实现 PartialEq 也不实现 Eq,因为 for <'a> fn(&'a _) does not implement those traits.)
因此,我们不能仅仅依靠 StructuralPartialEq 和 Eq 的幼稚检查。
要解决此问题,我们使用两个派生对象 (#[derive(PartialEq)] 和 #[derive(Eq)]) 中的每个派生注入的两个单独的 traits,并检查它们是否都作为结构匹配检查的一部分出现。