println!宏是否递归解引用?为何多级引用打印结果一致?
Rust多级引用使用println!打印值一致的原因
先看示例代码:
fn main() { let value = 42; let reference: &i32 = &value; let reference2: &&i32 = &&value; let reference3: &&&i32 = &reference2; println!(" Value: {}", value); // 输出: 42 println!(" Reference: {}", reference); // 输出: 42 println!("Reference2: {}", reference2); // 输出: 42 println!("Reference3: {}", reference3); // 输出: 42 }
问题
为什么打印不同层级的引用时,输出结果都是底层值42,而非对应的内存地址?Display的实现是否会递归解引用直到获取到值?
解答
Displaytrait的自动解引用逻辑
当某个类型T实现了Displaytrait,Rust会为所有层级的引用类型(&T、&&T、&&&T...)自动实现Display,实现逻辑就是递归解引用,直到调用到底层T的Display方法。所以不管传递多少层引用给println!的{}占位符,最终都会打印底层值。如何打印引用的地址
如果需要打印引用对应的内存地址,要使用专门的格式化占位符{:p},它会直接输出指针的内存地址。示例:
println!("Reference address: {:p}", reference); // 输出类似: 0x7ffdxxxxxx
内容的提问来源于stack exchange,提问作者Ruan_fer
相关产品推荐
相关产品推荐

