g-var.com | G-VAR's Blog

Rust 1.2.1 | Debug

Tue Aug 4, 2015

转载请注明出处!

译文链接:Rust 1.2.1 | Debug

英文原文:Debug


所有想使用std::fmt格式化traits的类型均需要具有可打印输出的实现。只有在std库中的一些类型自动实现了这个特性。而其它类型就需要手动实现了。

fmt::Debug特性将此工作变得非常直接。所有类型均可以derive(自动创建)fmt::Debug实现。而对于fmt::Display不一定可行,其需要手动实现。

// 此结构体不可以被打印输出,因为其既不具有`fmt::Display`也不具有`fmt::Debug`
struct UnPrintable(i32);

// `derive`会为具有`fmt::Debug`属性的`struct`自动创建相关实现
#[derive(Debug)]
struct DebugPrintable(i32);

所有std库中的类型也都可以通过{:?}自动实现打印输出功能:

// 为`Structure`继承`fmt::Debug`实现.`Structure`是只包含了一个`i32`类型成员
#[derive(Debug)]
struct Structure(i32);

// 将`Structure`放入`Deep`结构体中.也使其具有打印输出功能.
#[derive(Debug)]
struct Deep(Structure);

fn main() {
    // 使用`{:?}`进行打印与`{}`类似
    println!("{:?} months in a year.", 12);
    println!("{1:?} {0:?} is the {actor:?} name.",
             "Slater",
             "Christian",
             actor="actor's");

    // `Structure`是可打印输出的!
    println!("Now {:?} will print!", Structure(3));

    // 使用`derive`的一个问题是对显示结果不可控.如果只想显示一个`7`该怎么办?
    println!("Now {:?} will print!", Deep(Structure(7)));
}

虽然fmt::Debug可以直接实现打印功能,但会损失一些优雅的特性。而通过手动实现fmt::Display是可以解决该问题的。

请参考: attributes, derive, std::fmt, 以及 struct

[ 转载必须在正文中标注并保留原文链接、译文链接等信息。]



  « Previous: Next: »