我正在寻找一种方法
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 - 听起来不可靠不,
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。