如何为包含函数类型别名的结构实现Debug?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何为包含函数类型别名的结构实现Debug?相关的知识,希望对你有一定的参考价值。

我有以下类型:

type RangeFn = fn(&Value, &Value) -> bool;

现在我想用这个struct

#[derive(Debug)]
struct Range {
    fun: RangeFn,
}

但是如果我有一个以struct为参数的RangeFn,那么我似乎无法从Debug得到它。如何使RangeFnDebug特性兼容?

答案

You can't implement (or derive) a trait you don't own on a type you don't own.

但是,这不是你想要做的。你想要的是为Debug实现Range,但你不能通过派生来做到这一点,因为fns没有实现Debug。实际上,导出Debug也需要所有字段都是Debug。然后你就会坚持自己实施Debug;毕竟,这只是一个正常的特征:

type RangeFn = fn(&(), &()) -> bool;

struct Range {
    fun: RangeFn,
    other_field: u32,
}

impl std::fmt::Debug for Range {
    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::result::Result<(), std::fmt::Error> {
        f.debug_struct("Range")
            .field("other_field", &self.other_field)
            .finish()
    }
}

fn main() {
    let r = Range {
        fun: |_, _| true,
        other_field: 42,
    };

    println!("{:?}", r);
}

(Qazxswpoi)

以上是关于如何为包含函数类型别名的结构实现Debug?的主要内容,如果未能解决你的问题,请参考以下文章

如何为单例函数创建别名?

如何为 c++ 的不同变量类型的结构元素创建动态数组?

如何为自定义JVM语言实现静态代码分析工具的类型信息?

如何为属性定义别名

如何为 Spark SQL 中的posexplode 列提供别名?

如何为数据框中的复杂列创建包含数组(案例类)的udf