struct Device;
struct CommandBuffer {
device: &Device,
// ...
}
// Does not work because Rust does not allow internal pointers
struct Something {
device: Device,
command_buffer: CommandBuffer,
}
一种解决方案是使用Arc
struct CommandBuffer {
device: Arc<Device>,
// ...
}
struct Something {
device: Arc<Device>,
command_buffer: CommandBuffer,
}
Arc
的缺点是间接,原子计数器以及逃避范围和保持Device
活着的可能性。
现在我不认为你可以解决Rust中的一个间接层,但是可以在Box
和Arc
之间创建一些东西吗?
struct CommandBuffer {
device: BoxRef<Device>,
// ...
}
struct Something {
device: Box<Device>,
command_buffer: CommandBuffer,
}
我在尝试实施BoxRef
时遇到的主要问题是,即使目前有借款,我也需要移动Box
。由于间接的程度,这在技术上应该是安全的,但我认为目前这不能用Rust表达。
let boxed_device = Box::new(device);
let device_ref = boxed_device.boxed_ref();
// Owner of the reference should be allowed to move
Something{device: boxed_device, CommandBuffer{device: device_ref}}
可以BoxRef
实施吗?我快速浏览了一下
owning_ref
但它似乎没有解决我的问题。
我还有什么其他方法可以在Rust中表达“内部指针”?
答案 0 :(得分:2)
这将有效:
struct Device;
struct CommandBuffer<'a> {
device: &'a Device, // ...
}
struct Something<'a> {
device: &'a Device,
command_buffer: CommandBuffer<'a>,
}
fn main() {
let dev = Device;
let smth = Something {
device: &dev,
command_buffer: CommandBuffer { device: &dev },
};
}
您不应该担心{/ 1}} 。
只需编写一个保持Arc
私有的新类型,并且只在没有Arc
的情况下将Deref
实现为&T
,就可以轻松解决逃避范围的可能性。