要件に基づく構造体の生の設計は、次のようになります。
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 --+
}
ただし、'a
inAnotherObj<'a>
をoriginal
. ただし、ライフタイムを提供する必要があるため、作成するライフタイムがどこにあるObj<'a>
かを指定する必要があります。Obj<'tbc>
'tbc
Obj
次の代替案をお勧めします。
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
}