Rust 是否跟踪唯一的对象 ID,我们可以打印它们吗?

Does Rust track unique object ids and can we print them?

Rust 是否在幕后为每个对象使用某种实例 ID?如果是,是否可以使其可见?

考虑一下

struct SomeStruct;

fn main() {
    let some_thing = SomeStruct;
    println!("{:UniqueId}", some_thing);
    let another = some_thing;
    println!("{:UniqueId}", another);
}

我在这里使用了带有 {:UniqueId} 的伪格式字符串。在这种情况下,它可能打印

4711
4712

我知道 Rust 会进行按位复制,我想让它真正可见。如果我有这样一个实例 ID,我可以通过比较 ID 使其可见。

虽然可能有另一种方法可以达到同样的效果。

不,Rust 没有任何自动生成的对象 ID。这种功能会给每个用户带来一些开销,而 Rust 希望尽可能少地施加开销。其他一切都应该选择加入。


据我所知,一个项目的地址是唯一的,你可以得到:

struct SomeStruct;

fn main() {
    let some_thing = SomeStruct;
    println!("{:p}", &some_thing);
    let another = some_thing;
    println!("{:p}", &another);
}
0x7ffc020ba638
0x7ffc020ba698

Everything1 占用了 space 某处,因此您可以获得那个 space 的地址并打印它。

这在某些情况下可能独特。例如,当您转移某项的所有权时,您可能希望 ID 保持不变。我认为在那种情况下,你必须自己动手。 。这样的方案不适用于您无法控制的对象。


1 — 好吧,几乎所有的东西。我知道 const 项不能保证有一个位置,这就是 static 项存在的原因。