Trait std::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,并检查它们是否都作为结构匹配检查的一部分出现。