Rust 调试格式化程序是否使用取消引用?

Rust 调试格式化程序是否使用取消引用?,rust,Rust,我对调试格式化程序如何到达引用链的末尾感到困惑 我的理解是,println!(“{:?}”,x)扩展为如下内容: ... print(&x) ... 它借用了x,而不是移动/复制它 现在打印的是MyNumber(1),而不是预期的&MyNumber(1): 由此我假设调试格式化程序遵循Rust语言本身为所有引用定义的通用Deref实现(impl-Deref for&T) 如果是这样,那么为什么下面的代码只打印MyNumber(1),而不打印1 use std::ops::{Deref}

我对调试格式化程序如何到达引用链的末尾感到困惑

我的理解是,
println!(“{:?}”,x)
扩展为如下内容:

... print(&x) ...
它借用了
x
,而不是移动/复制它

现在打印的是
MyNumber(1)
,而不是预期的
&MyNumber(1)

由此我假设调试格式化程序遵循Rust语言本身为所有引用定义的通用
Deref
实现(
impl-Deref for&T

如果是这样,那么为什么下面的代码只打印
MyNumber(1)
,而不打印
1

use std::ops::{Deref};

#[derive(Debug)]
struct MyNumber(u8);

impl Deref for MyNumber {
    type Target = u8;

    fn deref(&self) -> &Self::Target {
        &self.0
    }
}

fn main() {
    let x = MyNumber(1);
    println!("{:?}", x);
}
在我看来,调试格式化程序遵循Rust语言本身在
&T
上实现的
Deref
,但忽略了在自定义类型上实现的
Deref

有人知道为什么会这样吗?非常感谢任何帮助

有人知道为什么会这样吗?非常感谢任何帮助

如果选中,则搜索:


非常感谢您的解释。我错误地认为这其中包含了一个递归的deref。在阅读了参考文档和实际实现之后,我可以说,将任务委托给底层的“可调试”似乎要优雅得多。我越来越喜欢生锈了!
use std::ops::{Deref};

#[derive(Debug)]
struct MyNumber(u8);

impl Deref for MyNumber {
    type Target = u8;

    fn deref(&self) -> &Self::Target {
        &self.0
    }
}

fn main() {
    let x = MyNumber(1);
    println!("{:?}", x);
}