临时值的寿命不足

时间:2019-02-13 09:03:25

标签: rust

此代码有问题。我不知道为什么会出错。 应该先获取摄像机的输入,然后将其放入缓冲区结构(包含在推杆结构中)。

extern crate rscam;
// use std::fs::File;
// use std::io::prelude::*;

const WIDTH: usize = 1280;
const HEIGHT: usize = 720;

#[derive(Debug, Clone, Copy, PartialEq, Eq)]
struct Pyxel {
    r: u8,
    g: u8,
    b: u8,
}

impl Pyxel {
    fn new() -> Pyxel {
        Pyxel { r: 0, g: 0, b: 0 }
    }
}

#[repr(transparent)]
struct Buffer {
    pyxels: [[Pyxel; WIDTH]; HEIGHT],
}

// impl Buffer {
//  fn new(s: [[Pyxel; WIDTH]; HEIGHT]) -> Buffer {
//      Buffer {
//          pyxels: s,
//      }
//  }
// }

struct Putter {
    x: usize,
    y: usize,
    buffer: &'static mut Buffer,
}

impl Putter {
    fn put_pyxel(&mut self, r: u8, g: u8, b: u8) {
        if self.x >= WIDTH {
            self.move_down();
        }
        let col = self.x;
        let row = self.y;
        self.buffer.pyxels[row][col] = Pyxel { r: r, g: g, b: b };
        self.x += 1;
    }
    fn move_down(&mut self) {
        self.y += 1;
    }
    fn new() -> Putter {
        Putter {
            x: 0,
            y: 0,
            buffer: &mut Buffer {
                pyxels: [[Pyxel::new(); WIDTH]; HEIGHT],
            },
        }
    }
}

fn main() {
    let mut camera = rscam::new("/dev/video0").unwrap();
    camera
        .start(&rscam::Config {
            interval: (1, 30),
            resolution: (1280, 720),
            format: b"RGB3",
            ..Default::default()
        })
        .unwrap();

    let frame = camera.capture().unwrap();

    let mut putter = Putter::new();
}

错误:

error[E0597]: borrowed value does not live long enough
   --> src/main.rs:65:20
   |
57 |               buffer: &mut Buffer {
   |  __________________________^
58 | |                 pyxels: [[Pyxel::new(); WIDTH]; HEIGHT],
59 | |             },
   | |_____________^ temporary value does not live long enough
60 |           }
61 |       }
   |       - temporary value only lives until here
   |
  = note: borrowed value must be valid for the static lifetime..

如何使用推杆内部的缓冲区(结构)?

在大多数情况下,我了解此错误的含义,而不是其工作原理。我只需要一种解决方法或解决方案。任何帮助表示赞赏。我本可以写得更好,但是我很累。

1 个答案:

答案 0 :(得分:2)

这对我来说或多或少是逻辑错误。您应该仔细阅读Rust ownership

考虑一下代码的工作方式。

struct Putter {
    x: usize,
    y: usize,
    buffer: &'static mut Buffer,
}

Buffer是一个引用,您的生存期等于程序的生存期, 'static告诉编译器。错误消息非常清楚,您正在就位创建临时值并借用它。退出作用域后将立即销毁它,因此您的引用将指向无效的内存。在Rust中,禁止使用悬挂引用。在像C ++这样的语言中,此示例可以很好地编译,但是会导致运行时错误。

要解决此问题,buffer应该在保持生命周期的同时重新考虑自身的价值和结构设计。

struct Putter {
    x: usize,
    y: usize,
    buffer: Buffer,
}