2016-08-22 12 views
3
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の1レベル間接を回避できるとは思っていませんが、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. 錆の「内部ポインタ」を他にどのように表示する必要がありますか?

+0

私は間違っているかもしれませんが、恐らく 'RefCell'の後ろにいるようですね? –

+0

@SimonWhiteheadアクティブな借用がある場合、 'RefCell'も移動できません、または私はあなたの質問を誤解していますか? –

+0

謝罪私はあなたのことを誤解したと思う。夜遅くだった。私が知っている限り、カスタムラッパーを使って 'Arc'や 'Rc'を知っている限り、これは唯一の方法です。 –

答えて

1

これは動作します:あなたはおよそArcパフォーマンスを心配してはいけません

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 }, 
    }; 
} 

ことくらい。

範囲を脱出の可能性だけで簡単にプライベートArcを保つのnewtypeを書くことで対処、そして唯一のCloneなしDeref&Tにを実装することができます。

関連する問題