Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 有条件地将T从Rc移出<;T>;当计数为1时_Rust_Reference Counting_Ownership Semantics - Fatal编程技术网

Rust 有条件地将T从Rc移出<;T>;当计数为1时

Rust 有条件地将T从Rc移出<;T>;当计数为1时,rust,reference-counting,ownership-semantics,Rust,Reference Counting,Ownership Semantics,当计数为1时,是否有方法从Rc移动对象?我正在考虑如何实施: fn take_ownership<T>(shared: Rc<T>) -> Result<T, Rc<T>> { ... } fn取得所有权(共享:Rc)->结果{…} 语义是,如果计数为1,则得到T,否则返回shared,以便稍后重试。标准库提供以下功能: 谢谢好吧,这太尴尬了。当我最初搜索文档时,我寻找了一个可选的返回,这就是为什么我错过了这个函数。然后我意识到结果会更有

当计数为
1
时,是否有方法从
Rc
移动对象?我正在考虑如何实施:

fn take_ownership<T>(shared: Rc<T>) -> Result<T, Rc<T>> { ... }
fn取得所有权(共享:Rc)->结果{…}

语义是,如果计数为
1
,则得到
T
,否则返回
shared
,以便稍后重试。

标准库提供以下功能:


谢谢好吧,这太尴尬了。当我最初搜索文档时,我寻找了一个可选的返回,这就是为什么我错过了这个函数。然后我意识到结果会更有用,但我已经确信答案不在文档中,因为之前的搜索。逻辑失败:(@red75prime:不妨将此作为一个答案发布,这样它就可以被接受,我们都可以继续:)另请参阅。
fn try_unwrap(this: Rc<T>) -> Result<T, Rc<T>>
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);