从防 rust 指南:

为了解引用(得到被引用的值,而不是引用本身),我们使用星号(*)

所以我做到了:

fn main() {
    let x = 1;
    let ptr_y = &x;
    println!("x: {}, ptr_y: {}", x, *ptr_y);
}

这给了我相同的结果(x=1;y=1),即使没有明确的解引用:

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

为什么?ptr_y不应该打印内存地址,*ptr_y不应该打印1吗?是否存在某种自动取消引用或我错过了什么?

推荐答案

Rust通常关注对象值(即内容的有趣部分),而不是对象标识(内存地址).implementation of Display代表&T,其中T实现Display直接取决于内容.为DisplayString实现手动扩展该宏:

impl<'a> Display for &'a String {
    fn fmt(&self, f: &mut Formatter) -> Result {
        Display::fmt(&**self, f)
    }
}

也就是说,它只是直接打印内容.

如果您关心对象标识/内存地址,可以使用Pointer formatter{:p}:

fn main() {
    let x = 1;
    let ptr_y = &x;
    println!("x: {}, ptr_y: {}, address: {:p}", x, ptr_y, ptr_y);
}

输出:

x: 1, ptr_y: 1, address: 0x7fff4eda6a24

playground

Rust相关问答推荐

当为a Self:IntoIterator设置trait bind `时,获取`a T `不是迭代器"&'"<'>&'

将内部类型作为参数的泛型 struct 上的方法

如何容器化Linux上基于Rust的Windows应用程序的编译过程?

为什么我们需要std::thread::scope,如果我们可以使用thread.join()在函数的生命周期内删除引用?

应为关联类型,找到类型参数

Rust proc_macro 和 syn:解析空格

try 实现线程安全的缓存

为什么是&mut发送?线程如何在安全的 Rust 中捕获 &mut?

需要一个有序向量来进行 struct 初始化

当没有实际结果时,如何在 Rust 中强制执行错误处理?

闭包返回类型的生命周期规范

如何在Rust中使用Serde创建一个自定义的反序列化器来处理带有内部标记的枚举

有什么方法可以通过使用生命周期来减轻嵌套生成器中的当生成器产生时borrow 可能仍在使用错误?

Rust Redis 中的 HSET 命令问题

rust tokio::spawn 在 mutexguard 之后等待

Rust 中的方法调用有什么区别?

在构建器模式中捕获 &str 时如何使用生命周期?

Rust 中的通用 From 实现

为什么这个闭包没有比 var 长寿?

如何在不设置精度的情况下打印浮点数时保持尾随零?