2
當計數爲1
時,是否有辦法將對象從Rc<T>
中移出?我在想一個如何實施:當計數爲1時有條件地將T從Rc <T>移出
fn take_ownership<T>(shared: Rc<T>) -> Result<T, Rc<T>> { ... }
語義將是你T
如果計數爲1
,你回來shared
否則這樣你就可以稍後再試。
當計數爲1
時,是否有辦法將對象從Rc<T>
中移出?我在想一個如何實施:當計數爲1時有條件地將T從Rc <T>移出
fn take_ownership<T>(shared: Rc<T>) -> Result<T, Rc<T>> { ... }
語義將是你T
如果計數爲1
,你回來shared
否則這樣你就可以稍後再試。
標準庫提供的Rc::try_unwrap
功能:
fn try_unwrap(this: Rc<T>) -> Result<T, Rc<T>>
返回所包含的值,如果
Rc
恰好具有一個強 參考。否則,
Err
返回與中傳遞相同Rc
。這會成功,即使有優秀的弱引用。
例子
use std::rc::Rc; let x = Rc::new(3); assert_eq!(Rc::try_unwrap(x), Ok(3)); let x = Rc::new(4); let _y = Rc::clone(&x); assert_eq!(*Rc::try_unwrap(x).unwrap_err(), 4);
https://doc.rust-lang.org/std/rc/struct.Rc.html#method.try_unwrap – red75prime
謝謝!好的,這很尷尬。當我最初搜索文檔時,我尋找可選的返回,這就是爲什麼我錯過了這個功能。然後我意識到結果會更有用,但我已經確信由於以前的搜索,答案不在文檔中。邏輯失敗:( –
@ red75prime:不妨將它發佈爲答案,以便它可以被接受,我們都可以繼續:) –