我正在与一些使用标准 void* userdata
方法的 C 回调进行交互,以允许您存储对某些上下文(例如结构体)的引用。如何在 void*
中存储对 Rust 结构体的引用并仍然允许其移动?似乎 Rust 的移动确实是移动,也就是说,这段代码失败了(如预期):
struct Thing {
pointer_to_self: *mut Thing,
}
fn create_thing() -> Thing {
let mut a = Thing {
pointer_to_self: std::ptr::null_mut(),
};
a.pointer_to_self = &mut a as *mut _;
a
}
fn main() {
let mut b = create_thing();
assert_eq!(&mut b as *mut _, b.pointer_to_self);
}
有没有什么方法可以解决这个问题?我能否拥有一个 Rust 值,在移动它时不改变其地址?