struct Device;
struct CommandBuffer {
device: &Device,
// ...
}
// Does not work because Rust does not allow internal pointers
struct Something {
device: Device,
command_buffer: CommandBuffer,
}
Одним из решений было бы использовать Arc
Возможно ли иметь внутренние указатели без использования `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?
Возможно, я ошибаюсь, но похоже, что вы после «RefCell», возможно? –
@SimonWhitehead «RefCell» также нельзя перемещать, когда есть активные роли, или я неправильно понимаю ваш вопрос? –
Извинения, я думаю, что неправильно понял ваш - было поздно ночью. Без использования 'unsafe' .. насколько я знаю,' Arc' и/или 'Rc' с пользовательской оболочкой будет единственным способом сделать это. –