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)
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)
| 归档时间: |
|
| 查看次数: |
78 次 |
| 最近记录: |