rust에서 사용하는 주요 매크로의 생성 코드를 확인해보자.
use core::fmt::Formatter;
use std::fmt::Display;
#[derive(Debug, Copy, PartialEq, Eq)]
struct MyStruct {
name: String,
}
impl Display for MyStruct {
fn fmt(&self, _: &mut Formatter<'_>) -> Result<(), std::fmt::Error> {
todo!()
}
}
HIR
struct MyStruct {
name: String,
}
#[automatically_derived]
impl ::core::fmt::Debug for MyStruct {
#[inline]
fn fmt<'_, '_, '_>(self: &'_ Self, f: &'_ mut ::core::fmt::Formatter<>)
->
::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field1_finish(f, "MyStruct",
"name", &&self.name)
}
}
#[automatically_derived]
impl ::core::marker::Copy for MyStruct { }
#[automatically_derived]
impl ::core::marker::StructuralPartialEq for MyStruct { }
#[automatically_derived]
impl ::core::cmp::PartialEq for MyStruct {
#[inline]
fn eq<'_, '_>(self: &'_ Self, other: &'_ MyStruct)
-> bool { self.name == other.name }
}
#[automatically_derived]
impl ::core::cmp::Eq for MyStruct {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_receiver_is_total_eq<'_>(self: &'_ Self)
-> () { let _: ::core::cmp::AssertParamIsEq<String>; }
}
impl Display for MyStruct {
fn fmt<'_, '_, '_>(self: &'_ Self, _: &'_ mut Formatter<'_>)
->
Result<(),
std::fmt::Error> {
// The variable 'maybe_name' is consumed here ...
// ... and is now unavailable.
// println!("Hello again, {}", maybe_name.unwrap_or("world".into()));
::core::panicking::panic("not yet implemented")
}
}