如何为类型别名实现特征?

时间:2019-06-24 01:16:07

标签: rust

我有一些这样的代码:

type MyFn = Box<Fn(usize) -> bool>;

fn main() {
    let my_fn: MyFn = Box::new(|x: usize| x > 10);
    dbg!(my_fn);
}

由于MyFn未实现std::fmt::Debug,因此无法编译。那是合理的,那么如果我尝试为MyFn实现它呢?

失败说:

类型为std::fmt::Debug的特征std::boxed::Box<(dyn std::ops::Fn(usize) -> bool + 'static)>的冲突实现

以及:

当前箱中定义的特征只能用于任意类型

如何为Debug实现MyFn和其他特征?

1 个答案:

答案 0 :(得分:3)

创建类型别名不会创建全新的类型,而只是允许您通过其他名称引用现有类型。因此,尝试为Debug实现MyFn与尝试为Box<Fn(usize) -> bool>实现{-}完全相同-这是不允许的,因为您的箱子不拥有类型或特征。 Rust的“孤立规则”要求您的板条箱定义一个或两个都可以使实施有效。

解决此问题的常见模式是创建一个'newtype'结构,该结构包装了该类型:

struct MyFn(Box<Fn(usize) -> bool>);

您可以 为此结构实现Debug,因为该结构来自您的板条箱。