宏print!
、println!
、eprint!
、eprintln!
、write!
、writeln!
和format!
是一种特殊情况,隐式引用要格式化的任何参数.
这些宏的行为与正常函数不同,宏的行为是为了方便;事实上,他们默不作声地引用是这种差异的一部分.
fn main() {
let x = 5;
println!("{}", x);
}
在nightly compiler上运行rustc -Z unstable-options --pretty expanded
,我们可以看到println!
扩展为:
#![feature(prelude_import)]
#[prelude_import]
use std::prelude::v1::*;
#[macro_use]
extern crate std;
fn main() {
let x = 5;
{
::std::io::_print(::core::fmt::Arguments::new_v1(
&["", "\n"],
&match (&x,) {
(arg0,) => [::core::fmt::ArgumentV1::new(
arg0,
::core::fmt::Display::fmt,
)],
},
));
};
}
进一步整理,是这样的:
use std::{fmt, io};
fn main() {
let x = 5;
io::_print(fmt::Arguments::new_v1(
&["", "\n"],
&[fmt::ArgumentV1::new(&x, fmt::Display::fmt)],
// ^^
));
}
注意&x
.
如果你写println!("{}", &x)
,那么你就要处理两个层次的参考文献;这具有相同的结果,因为&T
有一个std::fmt::Display
的实现,其中T
实现了Display
(显示为impl<'a, T> Display for &'a T where T: Display + ?Sized
),它只是通过它.你也可以写&&&&&&&&&&&&&&&&&&&&&&&x
.