使用Formatter :: debug_list为二维数组实现Debug

A.B*_*.B. 4 debugging traits multidimensional-array rust

我想知道是否有可能将其编译.

impl<T: fmt::Debug> fmt::Debug for Array2<T> {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        let ref mut builder = f.debug_list();
        self.rows().fold(builder, |b, e| b.entry(e)).finish()
    }
}
Run Code Online (Sandbox Code Playgroud)

self.rows是一个产生的迭代器&[T].

这里的错误是Size不是[T]在上下文中实现的b.entry(e),这是奇怪的,因为迭代器&[T]如前所述产生.

我无法解决这个问题,部分原因是因为我无法理解这里涉及的功能签名.

fn entry(self, entry: &Debug) -> DebugList<'a, 'b>
Run Code Online (Sandbox Code Playgroud)

请注意&Debug.

然而,相关的文档示例是将引用传递&i32给构建器.

struct Foo(Vec<i32>);

impl fmt::Debug for Foo {
    fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
        self.0.iter().fold(fmt.debug_list(), |b, e| b.entry(e)).finish()
    }
}
Run Code Online (Sandbox Code Playgroud)

由于这种混乱,必须有一些有趣的东西需要学习.

期望的输出就像是[[1, 2], [3, 4]].

任何人都可以编译的类似示例:

use std::fmt;

fn fmt<T: fmt::Debug>(vec: &Vec<T>, f: &mut fmt::Formatter) -> fmt::Result {
    let ref mut builder = f.debug_list();
    vec.chunks(4).fold(builder, |b, e| b.entry(e)).finish()
}
Run Code Online (Sandbox Code Playgroud)

Chr*_*gan 5

entry() 由此定义:

pub fn entry(&mut self, entry: &fmt::Debug) -> &mut DebugList<'a, 'b>;
Run Code Online (Sandbox Code Playgroud)

它需要一个fmt::Debug 特质对象.因此,当你传递它时&[T],它想要隐式地将它强制转换为&fmt::Debug.然而,这不能做到,因为特征对象只能由大小的对象构成.解决方案是制作大小切片的特征对象; 也就是说,传递一些类型&&[T],然后可以隐式转换为&fmt::Debug包含类型的类型&[T].也就是说,b.entry(&e)而不是b.entry(e).

您的builder生产线也是不必要的,实际上会引入生命问题 fold为方便起见,您应该将其声明为通话的一部分.

这将使您将此作为最终结果:

impl<T: fmt::Debug> fmt::Debug for Array2<T> {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        self.rows().fold(&mut f.debug_list(), |b, e| b.entry(&e)).finish()
    }
}
Run Code Online (Sandbox Code Playgroud)