クラスに別のクラスを格納したい
やりたい事を下記のようにコードにしました(動きません。
Outer
クラスにInner
を格納します。このInnerは別のオブジェクトとしてCloneされず、参照数がインクリメントされ同一のオブジェクトが入るようにしたいです。Cloneされると別のオブジェクトとなり一方に行った変更が反映されません。
rust
1#[pyclass] 2stract Inner { 3 a: u32 4} 5 6#[pyclass] 7stract Outer { 8 inner: Inner 9} 10 11#[pymethods] 12impl Outer { 13 #[new] 14 fn new(inner: &Inner) -> PyResut<Self> { 15 let inner = inner.deref(); 16 Ok(Outer{inner}) 17 } 18 19 fn get(&self) -> u32 { 20 self.inner.a 21 } 22}
一方で下記の様に書き換えました(動きます。
オブジェクトがCloneされず同一のままですが特定のClassではないので格納するだけになり内部で作業する事ができません。
rust
1#[pyclass] 2stract Inner { 3 a: u32 4} 5 6#[pyclass] 7stract Outer { 8 inner: PyObject 9} 10 11#[pymethods] 12impl Outer { 13 #[new] 14 fn new(inner: PyObject) -> PyResut<Self> { 15 Ok(Outer{inner}) 16 } 17 18 fn get(&self) -> u32 { 19 self.???.a 20 } 21}
参考になりそうなもの
PyO3のドキュメントを読んでいますがどうすればいいのかわかりません。
何かわかる方は回答の方をよろしくお願いします。
追記 2020/3/30 19時
前回の質問 を見直してこねくり回していたら同じオブジェクトを格納できたようです。しかし今度は格納したオブジェクトの操作方法がわかりません。extractしてPyRef
やPyRefMut
でラップした型を借りると思うのですが。
rust
1#[pyclass] 2stract Inner { 3 a: u32 4} 5 6#[pyclass] 7stract Outer { 8 inner: Py<Inner> 9} 10 11#[pymethods] 12impl Outer { 13 #[new] 14 fn new(inner: &PyCell<Inner>) -> PyResut<Self> { 15 let inner = inner.into(); 16 Ok(Outer{inner}) 17 } 18 19 20 fn obj(&self, py: Python) -> PyObject { 21 self.inner.to_object(py) 22 } 23 24 fn get(&self) -> u32 { 25 // not work 26 self.inner.a 27 } 28}
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。