• 测试实例:List
    • 动手试一试:
    • 参见:

    测试实例:List

    对一个结构体来说,须对各个元素逐个实现 fmt::Display 可能会很麻烦。问题在于每个 write!
    都要生成一个 fmt::Result。彻底地实现需要处理所有的结果。出于这方面考虑,Rust 提供了 try! 宏。

    write! 上使用 try!类似这样:

    1. // 对 `write!` 进行尝试(try),观察是否出错。若发生错误,返回相应的错误。
    2. // 否则(没有出错)继续执行后面的语句。
    3. try!(write!(f, "{}", value));

    在有 try! 的基础上,对一个 Vec 实现 fmt::Display 是相当直接的:

    1. use std::fmt; // 导入 `fmt` 模块。
    2. // 定义一个包含不同包含 `Vec` 的结构体 `List`。
    3. struct List(Vec<i32>);
    4. impl fmt::Display for List {
    5. fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
    6. // 对 `self` 解引用,并通过解构创建一个指向 `vec` 的引用。
    7. let List(ref vec) = *self;
    8. try!(write!(f, "["));
    9. // 对 `vec` 进行迭代,`v` 为每次迭代的值,`count` 为计数。
    10. for (count, v) in vec.iter().enumerate() {
    11. // 在调用 `write!` 前对每个元素(第一个元素除外)加上逗号。
    12. // 使用 `try!` ,在出错的情况返回。
    13. if count != 0 { try!(write!(f, ", ")); }
    14. try!(write!(f, "{}", v));
    15. }
    16. // 加上配对中括号,并返回一个 fmt::Result 值
    17. write!(f, "]")
    18. }
    19. }
    20. fn main() {
    21. let v = List(vec![1, 2, 3]);
    22. println!("{}", v);
    23. }

    动手试一试:

    更改程序使 vector 里面元素的索引也能够打印出来。新的结果如下:

    1. [0: 1, 1: 2, 2: 3]

    参见:

    for, ref, Result, struct,
    try!, vec!