Rust 正在尝试实现core::fmt::Show

Rust 正在尝试实现core::fmt::Show,rust,traits,Rust,Traits,我正在尝试为我的二叉树实现core::fmt::Show。这是我的实现代码: impl<T: PartialEq + PartialOrd + Show> Show for Node<T> { fn fmt(&self, f: &mut Formatter) -> Result<(), &str> { match self.left { Some(ref x) => {

我正在尝试为我的二叉树实现core::fmt::Show。这是我的实现代码:

impl<T: PartialEq + PartialOrd + Show> Show for Node<T>
{
    fn fmt(&self, f: &mut Formatter) -> Result<(), &str>
    {
        match self.left {
            Some(ref x) => {x.fmt(f);},
            None => {}
        };
        match self.value {
            Some(ref x) => {
                write!(f, "{}", x.to_string().as_slice());
            },
            None => {}
        };
        match self.right {
            Some(ref x) => {x.fmt(f);},
            None => {}
        };
        Ok(())
    }
}
impl为节点显示
{
fn fmt(&self,f:&mut格式化程序)->结果
{
左配{
一些(ref x)=>{x.fmt(f);},
无=>{}
};
匹配自我价值{
一些(参考x)=>{
写!(f,“{}”,x.到_string()。作为_slice());
},
无=>{}
};
匹配自我,对吗{
一些(ref x)=>{x.fmt(f);},
无=>{}
};
好(())
}
}
但是编译器抛出以下错误:

编译二叉树v0.0.1(file:///home/guillaume/projects/binary_tree)src/binary_tree.rs:60:2: 77:3错误:方法
fmt
的trait类型不兼容:预期 enum core::fmt::FormatError,找到了&-ptr[E0053]src/binary_tree.rs:60 fn fmt(&self,f:&mut格式化程序)->结果 src/binary_tree.rs:61{src/binary_tree.rs:62匹配self.left{ src/binary_tree.rs:63 Some(ref x)=>{x.fmt(f);}, src/binary_tree.rs:64 None=>{}src/binary_tree.rs:65}


我不明白为什么。可以找到完整的代码。欢迎对我的代码发表任何评论。

错误告诉您方法
fmt
没有它期望的类型,特别是它找到了一个&ptr(即&str),其中应该有一个格式错误

将方法签名更改为此将修复编译错误:

  fn fmt(&self, f: &mut Formatter) -> Result<(), fmt::FormatError>
fn fmt(&self,f:&mut格式化程序)->结果

我已经在github上发送了一个pull请求,进行了此更改(还修复了您的测试,以便我可以验证它是否有效)

由@mcpherinm提出的答案正在解决错误,但rustc仍发出一些警告。这是用于删除警告的代码:

fn fmt(&self, f: &mut Formatter) -> Result<(), fmt::FormatError>
{
    let mut result = Ok(());
    match self.left {
        Some(ref x) => {
            result = result.and(x.fmt(f));
        },
        None => {;}
    };
    match self.value {
        Some(ref x) => {
            result = result.and(write!(f, "{}", x.to_string().as_slice()));
        },
        None => {;}
    };
    match self.right {
        Some(ref x) => {
            result = result.and(x.fmt(f));
        },
        None => {;}
    };
    result
}
fn fmt(&self,f:&mut格式化程序)->结果
{
让mut result=Ok(());
左配{
一些(参考x)=>{
结果=结果和(x.fmt(f));
},
无=>{;}
};
匹配自我价值{
一些(参考x)=>{
result=result.and(将!(f,“{}”,x.to_string().as_slice());
},
无=>{;}
};
匹配自我,对吗{
一些(参考x)=>{
结果=结果和(x.fmt(f));
},
无=>{;}
};
后果
}
这一切都是为了确保将错误消息转发给此函数的调用者

问题:


如果发生错误,函数将递归执行,如果弹出多条错误消息,最后一条将覆盖旧的错误消息。对吗?

最好使用
fmt::Result
而不是显式
Result
。这就是
Show
trait本身的功能。非常感谢您花时间更正我的错误密码