Enums 如何在Rust中的泛型枚举上实现fmt::Display?

Enums 如何在Rust中的泛型枚举上实现fmt::Display?,enums,formatting,rust,Enums,Formatting,Rust,我已经用这个递归枚举实现了我的链表,但是现在我想为它实现一个自定义的显示格式 use std::fmt; #[derive(Debug)] enum List<A> { Empty, Cons(A, Box<List<A>>), } impl<T> fmt::Display for List<T> { fn fmt(&self, f: &mut fmt::Formatter) -> fm

我已经用这个递归枚举实现了我的链表,但是现在我想为它实现一个自定义的显示格式

use std::fmt;

#[derive(Debug)]
enum List<A> {
    Empty,
    Cons(A, Box<List<A>>),
}

impl<T> fmt::Display for List<T> {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        match *self {
            List::Empty => write!(f, "()"),
            List::Cons(x, ref xs) => write!(f, "({} {})", x, xs),  
        }
    }
}
这是我剩下的代码,如果这很重要的话

fn cons<A>(x: A, xs: List<A>) -> List<A> {
    return List::Cons(x, Box::new(xs));
}

fn len<A>(xs: &List<A>) -> i32 {
    match *xs {
        List::Empty => 0,
        List::Cons(_, ref xs) => 1 + len(xs),
    }
}

fn map<A, B>(f: &Fn(&A) -> B, xs: &List<A>) -> List<B> {
    match *xs {
        List::Empty => List::Empty,
        List::Cons(ref x, ref xs) => cons(f(x), map(f, xs)),
    }
}

fn main() {
    let xs = cons(1, cons(2, cons(3, List::Empty)));
    println!("{}", xs);
    println!("{:?}", len(&xs));

    let f = |x: &i32| (*x) * (*x);
    let ys = map(&f, &xs);
    println!("{}", ys);
    println!("{}", List::Empty);
}

我真的很想看到这一点,但我完全不知道如何使用
fmt::Result

(1 2 3)
3.
(1 4 9) 
()
解决编译器错误 你缺少了一个特性限制。也就是说,您需要告诉Rust可以显示
T

impl<T: fmt::Display> fmt::Display for List<T> {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        match *self {
            List::Empty => write!(f, "()"),
            List::Cons(ref x, ref xs) => write!(f, "({} {})", x, xs),  
        }
    }
}

注意most
写入后的
宏调用。它的基本意思是:如果这个
导致错误,立即返回错误。否则,继续执行该函数。

我主要感兴趣的是解决这两个问题中较简单的一个。如果我们能找出后一种格式选项,那只是锦上添花。供将来参考:您的问题的确切原因和解决方案就在错误消息中。第一行告诉您,
T
缺少必要的约束,后面的注释建议您可以使用这种形式来介绍它。DK事后看来,这是有道理的。但在看到被接受的答案之前,我甚至不知道这些东西意味着什么。尽管如此,您的注释还是很有帮助的。^^^如果您运行它建议的命令(rustc--explain E0277),它会打印出更完整的解释和示例,向您展示它的含义。我提出这个只是为了确保你现在知道信息在那里。谢谢,我是认真的。我目前正在学习使用repl.it/languages/rust buy我明天会安装rust-promise还注意到
x
已更改为
ref x
。另一个有用的答案是aochagavia。想在第二个列表显示格式上摇摆一下吗?刚刚为此编写了一个函数:)arigatou!你给了我很多有用的东西让我思考!
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
    write!(f, "(")?;
    let mut temp = self;
    while let List::Cons(ref x, ref xs) = *temp {
        write!(f, "{}", x)?;

        // Print trailing whitespace if there are more elements
        if let List::Cons(_, _) = **xs {
            write!(f, " ")?;
        }

        temp = xs;
    }

    write!(f, ")")
}