Rust 是普林顿!借用还是拥有变量?

Rust 是普林顿!借用还是拥有变量?,rust,ownership,Rust,Ownership,我对借贷和所有权感到困惑。锈迹斑斑 他们说 println可以借用x 我对此感到困惑。如果println借用x,为什么它通过x而不是&x 我尝试运行下面的代码 fn main() { let mut x = 5; { let y = &mut x; *y += 1; } println!("{}", &x); } 此代码与上面的代码相同,只是我将&x传递到println。它将“6”打印到控制台,这是正确的,结果与第

我对借贷和所有权感到困惑。锈迹斑斑

他们说

println可以借用
x

我对此感到困惑。如果
println
借用
x
,为什么它通过
x
而不是
&x

我尝试运行下面的代码

fn main() {
    let mut x = 5;
    {
        let y = &mut x;
        *y += 1;
    }
    println!("{}", &x);
}

此代码与上面的代码相同,只是我将
&x
传递到
println。它将“6”打印到控制台,这是正确的,结果与第一个代码相同。

打印
println
eprint
eprintln
写入
格式
是一种特殊情况,隐式引用要格式化的任何参数

这些宏的行为与正常函数不同,宏的行为是为了方便;事实上,他们默默地引用是这种差异的一部分

fn main() {
    let x = 5;
    println!("{}", x);
}
在nightly编译器上运行
rustc-Z不稳定选项——相当扩展的
,我们可以看到
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)
,然后处理两个级别的引用;这具有相同的结果,因为存在for
&T
的实现,其中
T
实现了
显示(显示为
impl),我不明白为什么将这些宏称为“特例”。这种隐式引用传递可以对任何宏实现。@MarkusEnterwaditzer:当然,但问题是它看起来很正常,但事实并非如此。当然,其他宏也会使自己成为特例。事实是,一般情况下强烈建议不要这样做。也许这可以在书中指出?这也让我感到困惑。
use std::{fmt, io};

fn main() {
    let x = 5;
    io::_print(fmt::Arguments::new_v1(
        &["", "\n"],
        &[fmt::ArgumentV1::new(&x, fmt::Display::fmt)],
        //                     ^^
    ));
}