对于给定的 RefCell,RefCell::as_ptr 是否保证保持不变?

问题描述 投票:0回答:1

我正在寻找一种方法

impl Hash for MyStruct
,其中 MyStruct 包含`Rc(是的,它是某种链接列表)。

这个答案建议

std::ptr::hash(self.next.as_ref())
,但我怀疑RefCell地址是否有任何保证。

在 Ruby 中,我会使用

object_id
方法代替
as_ptr
作为哈希的唯一标识符。如果
as_ptr
在执行过程中可能会发生变化,给定的 RefCell 是否有任何类似的标识符?

我正在尝试解决https://leetcode.com/problems/copy-list-with-random-pointer/

  • 尝试过
    #[Derive(Debug)]
    - 没有用,因为 RefCell 默认情况下不实现哈希,这有什么意义
  • 遇到了对
    RefCell::borrow
    的建议,并以某种方式避免
    panic
    -s - 听起来不可靠
rust linked-list hashset refcell
1个回答
0
投票

不,

RefCell::as_ptr
在一般情况下不保证相同。一个例子:

let a = RefCell::new(42);
println!("address: {:?}", a.as_ptr());
let b = Some(a);
println!("address: {:?}", b.unwrap().as_ptr());

打印类似这样的内容:

address: 0x7ffe3737d228
address: 0x7ffe3737d300

原因是

RefCell
对象被移动了。在 Playground 上查看它的实际效果。


至于实际的解决方案:Rust 并不容易,但有办法。在你的例子中,该对象是一个

Rc<RefCell<_>>
。不可变
Rc
的内部指针无法更改,因为每个
Rc
实例都指向相同的堆地址。因此,
Rc::as_ref()
是稳定的。

我编写了一些代码,演示通过堆地址使用

Rc
作为
HashMap
键,但它并不漂亮:Playground

© www.soinside.com 2019 - 2024. All rights reserved.