【问题标题】:cannot return reference to temporary value无法返回对临时值的引用
【发布时间】:2020-09-12 14:39:27
【问题描述】:

我正在尝试学习 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 仅适用于此函数,并且在返回时会从堆栈中删除?

有没有办法解决这个问题?

【问题讨论】:

  • [self.id] 在堆栈上创建一个数组,&amp;[self.id] 指的是这个数组,但是由于这个数组是在一个功能块中创建的,所以当你退出to_buffer 功能块时它就会被丢弃。编译器抱怨您尝试返回对已删除数组的引用

标签: rust


【解决方案1】:

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

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

相反,您可以返回一个 owned 值,而不是对某个值的引用:

   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];
    }

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

【讨论】:

    【解决方案2】:

    因为您最初想要引用 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)
        }
    

    【讨论】:

      猜你喜欢
      • 2022-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-08
      • 2023-03-30
      • 1970-01-01
      • 2010-11-23
      相关资源
      最近更新 更多