makro print!
, println!
, eprint!
, eprintln!
, write!
, writeln!
ve format!
, özel bir durum vardır, normal şeyler kolaylık nedenlerle gibi davranmıyor. Referansları sessizce aldıkları gerçeği bu farklılığın bir parçası. Gece derleyici üzerinde rustc -Z unstable-options --pretty expanded
aracılığıyla
fn main() {
let x = 5;
println!("{}", x);
}
Run it ve biz println!
genişler görebilirsiniz:
#![feature(prelude_import)]
#![no_std]
#[prelude_import]
use std::prelude::v1::*;
#[macro_use]
extern crate std as std;
fn main() {
let x = 5;
::io::_print(::std::fmt::Arguments::new_v1(
{
static __STATIC_FMTSTR: &'static [&'static str] = &["", "\n"];
__STATIC_FMTSTR
},
&match (&x,) {
(__arg0,) => {
[
::std::fmt::ArgumentV1::new(__arg0, ::std::fmt::Display::fmt),
]
}
},
));
}
çok derli toplu, o da şu:
use std::fmt;
use std::io;
fn main() {
let x = 5;
io::_print(fmt::Arguments::new_v1(
&["", "\n"];
&[fmt::ArgumentV1::new(&x, fmt::Display::fmt)],
));
}
Not &x
. Eğer println!("{}", &x)
yazarsanız
, daha sonra referanslardan iki seviyeleri ile ilgileniyor; T
(impl<'a, T> Display for &'a T where T: Display + ?Sized
olarak gösterilmektedir) Display
uyguladığında &T
için std::fmt::Display
bir uygulama sadece geçtiği yoktur, çünkü bu aynı sonucu verir. &&&&&&&&&&&&&&&&&&&&&&&x
'u da yazabilirsiniz. O makroları "özel durum" derim neden
anlamıyorum. Bu tür bir örtük referans geçirme, herhangi bir makro için uygulanabilir. –
@MarkusUnterwaditzer: Tabii, ama şey normal görünüyor ama olmadığıdır. Ve elbette, diğer makrolar da kendilerini özel durumlara dönüştürebilir. Gerçek şu ki, genel olarak şiddetle tavsiye edilir. –