Trait std::marker::StructuralEq[][src]

pub trait StructuralEq { }
🔬 This is a nightly-only experimental API. (structural_match #31434)
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.)

因此,我们不能仅仅依靠 StructuralPartialEqEq 的幼稚检查。

要解决此问题,我们使用两个派生对象 (#[derive(PartialEq)]#[derive(Eq)]) 中的每个派生注入的两个单独的 traits,并检查它们是否都作为结构匹配检查的一部分出现。

Implementations on Foreign Types

Implementors