究竟是什么'#[派生(调试)]'在Rust?

时间:2017-09-24 09:01:16

标签: rust

#[derive(Debug)]究竟是什么意思?它与'a有关吗?例如:

#[derive(Debug)]
struct Person<'a> {
    name: &'a str,
    age: u8
}

1 个答案:

答案 0 :(得分:12)

#[...]struct Person上的attributederive(Debug)要求编译器auto-generate Debug一个合适的lifetime特征实现,它会在{:?}之类的内容中提供format!("Would the real {:?} please stand up!", Person { name: "John", age: 8 });的结果。

您可以通过执行cargo +nightly rustc -- -Zunstable-options --pretty=expanded来查看编译器的功能。在您的示例中,编译器将添加类似

的内容
#[automatically_derived]
#[allow(unused_qualifications)]
impl <'a> ::std::fmt::Debug for Person<'a> {
    fn fmt(&self, __arg_0: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
        match *self {
            Person { name: ref __self_0_0, age: ref __self_0_1 } => {
                let mut builder = __arg_0.debug_struct("Person");
                let _ = builder.field("name", &&(*__self_0_0));
                let _ = builder.field("age", &&(*__self_0_1));
                builder.finish()
            }
        }
    }
}

代码。由于这种实现几乎适用于所有用途,derive可以帮助您免于手动编写。

'a定义here。字段name是对某些str的引用;编译器需要一些关于此引用有效的信息(最终目标是str的引用在Person仍然在范围内时)不会变为无效。您的示例中的语法指出Personname共享相同的生命周期a