我有一些这样的代码:
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
和其他特征?
答案 0 :(得分:3)
创建类型别名不会创建全新的类型,而只是允许您通过其他名称引用现有类型。因此,尝试为Debug
实现MyFn
与尝试为Box<Fn(usize) -> bool>
实现{-}完全相同-这是不允许的,因为您的箱子不拥有类型或特征。 Rust的“孤立规则”要求您的板条箱定义一个或两个都可以使实施有效。
解决此问题的常见模式是创建一个'newtype'结构,该结构包装了该类型:
struct MyFn(Box<Fn(usize) -> bool>);
您可以 为此结构实现Debug
,因为该结构来自您的板条箱。