是否可以在不使用“Arc”的情况下使用“内部指针”?

时间:2016-08-22 12:44:27

标签: rust

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中的一个间接层,但是可以在BoxArc之间创建一些东西吗?

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}}
  1. 可以BoxRef实施吗?我快速浏览了一下 owning_ref 但它似乎没有解决我的问题。

  2. 我还有什么其他方法可以在Rust中表达“内部指针”?

1 个答案:

答案 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,就可以轻松解决逃避范围的可能性。

相关问题