15

オブジェクトの構築により、そのオブジェクトの有効期間に必要なデータが割り当てられますが、データへの参照を保持する必要がある別のオブジェクトも作成されます。

pub fn new() -> Obj {
    let data = compute();

    Obj {
        original: data,
        processed: AnotherObj {
            reference: &data
        }
    }
}

これをRustの言葉で表現することは可能ですか?

ここで私は、同じライフタイムを持ち、もちろんコールより長生きしたいと考えObjています。AnotherObjdatanew()

4

1 に答える 1

16

要件に基づく構造体の生の設計は、次のようになります。

struct AnotherObj<'a> {
    original: &'a Vec<i8>, // Let's agree on Vec<i8> as your "data" type.
}

struct Obj<'a> {
    original: Vec<i8>,         // <-------------------+
    processed: AnotherObj<'a>, // should point here --+
}

ただし、'ainAnotherObj<'a>original. ただし、ライフタイムを提供する必要があるため、作成するライフタイムがどこにあるObj<'a>かを指定する必要があります。Obj<'tbc>'tbcObj

次の代替案をお勧めします。

1. AnotherObj が実際にオリジナルを所有するようにする

なぜだめですか?Objを所有するため、ネストされた子としてAnotherObj引き続きアクセスできます。original

pub struct AnotherObj {
    original: Vec<i8>,
}

pub struct Obj {
    processed: AnotherObj,
}

pub fn new() -> Obj {
    let data = vec![1,2,3];

    Obj {
        processed: AnotherObj {
            original: data,
            // ...
        }
    }
}

// access as obj.processed.original, you can even create a getter `fn original(&self)`

2.共有ポインタ設計

refcounted ポインターの簡単な使用:

use std::rc::Rc;

pub struct AnotherObj {
    original: Rc<Vec<i8>>,
}

pub struct Obj {
    original: Rc<Vec<i8>>,
    processed: AnotherObj,
}

pub fn new() -> Obj {
    let data = Rc::new(vec![1,2,3]);

    Obj {
        original: data.clone(),
        processed: AnotherObj {
            original: data.clone(),
        }
    }
}

3.生のポインターを使用する

オプション 1. と 2. は安全な Rust 神々の安心をもたらしてくれるので、この 3 番目のオプションはお勧めしません。完全を期すために、まだここに投稿しています。注: コンパイルされますが、実行時にテストしたことがないため、噛み付く可能性があります。unsafe以下に安全なコードのみを示しますが、生のポインターを逆参照する場合は、土地に行かなければなりません。

use std::ptr;

pub struct AnotherObj {
    original: *mut Vec<i8>,
}

pub struct Obj {
    original: Vec<i8>,
    processed: AnotherObj,
}

pub fn new() -> Obj {
    let data = vec![1,2,3];

    let mut obj = Obj {
        original: data,
        processed: AnotherObj {
            original: ptr::null_mut(),
        }
    };
    obj.processed.original = &mut obj.original as *mut Vec<i8>;

    obj
}
于 2015-06-13T22:29:18.497 に答える