繁体   English   中英

不能返回对临时值的引用

[英]cannot return reference to temporary value

我正在尝试学习 Rust,在学习 Rust 的同时,我想尝试将结构对象转换为字节数组,但我在这样做时遇到了问题。

所以我有这个:

struct Node<'a> {
    id: u8,
    name: &'a str,
    data: &'a str,
}
impl<'a> Node<'a> {
    fn new() -> Node<'a> {
        return Node {
            id: 1,
            name: "superName",
            data: "some random desc2",
        };
    }

    fn to_buffer(&mut self) -> &'a [u8] {
        let mut size = mem::size_of::<Node>();
        size = size + self.name.len() * mem::size_of::<char>();
        size = size + self.data.len() * mem::size_of::<char>();
        println!("size {}", size);
        return &[self.id];
    }
}

但我只是收到错误“无法返回对临时值的引用”而且我不是 100% 确定我理解错误消息开头...是因为self.id仅作用于此函数并将被删除返回时从堆栈中?

有什么办法解决这个问题吗?

Rust 中以&开头的任何东西都是对值的引用,而不是值本身。 &[u8]是对需要存在于其他地方的值的引用。

因为您在函数创建了它作为引用的值,所以当函数返回时,引用指向的值不再存在。 id仍然存在,但包含id的切片不存在)。

相反,您可以返回一个拥有的值,而不是一个引用:

   fn to_buffer(&mut self) -> Vec<u8> {
        let mut size = mem::size_of::<Node>();
        size = size + self.name.len() * mem::size_of::<char>();
        size = size + self.data.len() * mem::size_of::<char>();
        println!("size {}", size);
        return vec![self.id];
    }

然后调用者可以参考他们是否需要。

由于您最初想要对self.id的引用,但仅将其视为一个元素的切片,因此我建议您不要创建新的拥有值(向量,具有堆分配...),而只需使用std::slice::from_ref()

    fn to_buffer(&mut self) -> &[u8] {
        let mut size = mem::size_of::<Node>();
        size = size + self.name.len() * mem::size_of::<char>();
        size = size + self.data.len() * mem::size_of::<char>();
        println!("size {}", size);
        // return &[self.id];
        std::slice::from_ref(&self.id)
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM