Rust 如何从Rc内部返回结构?

Rust 如何从Rc内部返回结构?,rust,Rust,我有一个用Rc包装的结构,名为Data。我想创建一个函数,返回Rc中的数据: use std::rc::Rc; fn main() { pub struct Data { pub tag: Vec<u8>, pub bytes: [u8; 32], pub length: u8, } pub struct SharedData { pointer: Rc<Data>, }

我有一个用
Rc
包装的结构,名为
Data
。我想创建一个函数,返回
Rc
中的
数据:

use std::rc::Rc;

fn main() {
    pub struct Data {
        pub tag: Vec<u8>,
        pub bytes: [u8; 32],
        pub length: u8,
    }

    pub struct SharedData {
        pointer: Rc<Data>,
    }

    pub fn get_data(shared: SharedData) -> Data {
        shared.pointer
    }
}
使用std::rc::rc;
fn main(){
发布结构数据{
酒吧标签:Vec,
发布字节:[u8;32],
酒吧长度:u8,
}
pub结构共享数据{
指针:Rc,
}
发布fn获取_数据(共享:SharedData)->数据{
共享指针
}
}

在这个人为设计的例子中,我去掉了很多周围的代码,因此这个想法可能看起来很奇怪。

如果您想删除Rc,可能值得一看。如果您确定不存在其他引用,则可以展开结果。

从文档中,
Rc
是一个示例。它用于在代码的不同部分之间共享数据,而不需要单一所有者。但是,这也暗示了代码无法直接返回
数据的原因:为了返回该数据,它必须首先找到一种方法来满足借用检查器的数据所有权概念

这些选项通常是单独拥有或克隆数据。在下面包含的已编辑代码中,我将
get_data
更改为首先通过取消引用指针(
Rc
实现)来访问
data
,然后在返回结构之前克隆结构。因为返回类型是
Data
(而不是
&Data
),这意味着该值现在由调用者拥有。因为它是克隆的,所以任何仍然引用
Rc
的代码都看不到任何突变。注意,在
Clone
方法可用之前,我需要在
Data
上导出
Clone
特征

#![允许(未使用)]
使用std::rc::rc;
使用std::错误;
使用std::error::error;
fn main(){
#[衍生(克隆)]
发布结构数据{
酒吧标签:Vec,
发布字节:[u8;32],
酒吧长度:u8,
}
pub结构共享数据{
指针:Rc,
}
发布fn获取_数据(共享:SharedData)->数据{
//取消对指针的引用,然后返回
//其数据的副本
(*shared.pointer.clone())
}
发布fn获取数据长度(共享:SharedData)->u8{
//对于更简单的类型,您可以只访问其中的字段
//直接数据
shared.pointer.length
}
}
我还包括了一个
get_data_length
,以演示共享数据的单个成员也可以在不进行正式克隆的情况下返回

最后,如果您想要共享对数据的可变访问权,那么使用a可能比使用
Rc

更合适,而不是使用
#[allow(unused)]
您可以删除帖子中未使用的变量;)请下次这样做,并使用
rustfmt
根据Rust指南格式化代码。