為什么Rust的println!不會發(fā)生所有權轉移?

macro

println!可能是學習Rust最常用的一行代碼了。我們連續(xù)多次調用它,下面的代碼編譯通過,再正常不過了。

let x = String::from("Hello!");
println!("{}", x);
println!("{}", x);

Hello!

Hello!

可是,我們明明傳的是x,并非&x,為什么沒有發(fā)生所有權轉移呢?

查查標準庫的源碼,如下:

#[macro_export]
#[stable(feature = "rust1", since = "1.0.0")]
#[allow_internal_unstable(print_internals, format_args_nl)]
macro_rules! println {
 () => ($crate::print!("\n"));
 ($($arg:tt)*) => ({
 $crate::io::_print($crate::format_args_nl!($($arg)*));
 })
}
?
#[unstable(
 feature = "format_args_nl",
 issue = "none",
 reason = "`format_args_nl` is only for internal \
 language use and is subject to change"
 )]
#[allow_internal_unstable(fmt_internals)]
#[rustc_builtin_macro]
#[macro_export]
macro_rules! format_args_nl {
 ($fmt:expr) => {{ /* compiler built-in */ }};
 ($fmt:expr, $($args:tt)*) => {{ /* compiler built-in */ }};
}

更讓人眼花繚亂了,就算啃得動Rust宏,啃到最后那句“compiler built-in”,也足以讓人崩潰。還是換個思路。

所謂“元編程”的Rust宏,是在編譯期進行展開,那如果能看到展開后的Rust代碼,可讀性就好很多了。

對于Rust,想看宏展開后的代碼,當然不是問題,真要夸夸Rust的工具鏈了,非常周到。唯一一個要求,就是需要切換到Rust Nightly版本。

先從安裝開始。

> rustup toolchain install nightly

裝好后可以看到默認是Stable版本。

> rustup toolchain list

stable-x86_64-pc-windows-msvc (default)

beta-x86_64-pc-windows-msvc

nightly-x86_64-pc-windows-msvc

從Stable切換到Nightly也非常簡單。

> cd ~/projects/print

> rustup override set nightly

萬事具備,進行展開,輸入:

> rustc --pretty expanded -Z unstable-options main.rs

#![feature(prelude_import)]
#![no_std]
#[prelude_import]
use ::std::prelude::v1::*;
#[macro_use]
extern crate std;
fn main() {
 let x = String::from("Hello!");
 {
 ::std::io::_print(::core::fmt::Arguments::new_v1(&["", "\n"],
 &match (&x,) {
 (arg0,) => [::core::fmt::ArgumentV1::new(arg0,::core::fmt::Display::fmt)],
 }));
 };
}

此時,在終端里會打印出將宏展開后的代碼,如果拷貝覆蓋粘貼進main.rs,一樣是可以編譯通過并運行的。

說到這里,關于問題的答案也已明了,展開代碼顯示:println!實際生成的代碼使用了&x,不可變借用

最后,記得切回Stable:

> rustup override set stable

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容