2017-08-06 57 views
2

當計數爲1時,是否有辦法將對象從Rc<T>中移出?我在想一個如何實施:當計數爲1時有條件地將T從Rc <T>移出

fn take_ownership<T>(shared: Rc<T>) -> Result<T, Rc<T>> { ... } 

語義將是你T如果計數爲1,你回來shared否則這樣你就可以稍後再試。

+5

https://doc.rust-lang.org/std/rc/struct.Rc.html#method.try_unwrap – red75prime

+0

謝謝!好的,這很尷尬。當我最初搜索文檔時,我尋找可選的返回,這就是爲什麼我錯過了這個功能。然後我意識到結果會更有用,但我已經確信由於以前的搜索,答案不在文檔中。邏輯失敗:( –

+1

@ red75prime:不妨將它發佈爲答案,以便它可以被接受,我們都可以繼續:) –

回答

2

標準庫提供的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); 
相關問題