0

假设我有以下返回元组的构造函数:

pub struct WebCam {
    id: u8
}

impl WebCam {
    fn new() -> (Self, bool) {
        let w = WebCam {id: 1 as u8};
        return (w, false);
    }
}

pub fn main() {
    static (cam, isRunning): (WebCam, bool) = WebCam::new();
}

上面的代码无法编译。但是,如果我改成staticlet编译就好了。我不确定如何为返回的元组的各个值设置生命周期(在一行中)?

4

1 回答 1

1

https://doc.rust-lang.org/reference/items/static-items.html

是否应该使用常量项或静态项可能会令人困惑。一般来说,常量应该优先于静态,除非满足以下条件之一:

正在存储大量数据
需要静态的单地址属性。
需要内部可变性。

静态项类似于常量,不同之处在于它表示程序中的精确内存位置。所有对静态的引用都指向相同的内存位置。静态项具有静态生命周期,它比 Rust 程序中的所有其他生命周期都要长。包含非内部可变类型的非可变静态项可以放置在只读内存中。静态项目不会在程序结束时调用 drop。

对静态的所有访问都是安全的,但对静态有许多限制:

该类型必须绑定 Sync 特征以允许线程安全访问。静态允许在用于初始化它们的常量表达式中使用指向静态的路径,但静态不能通过值引用其他静态,只能通过引用。常量不能引用静态。

我会像这样重写你的代码:

pub struct WebCam {
    id: u8,
}

impl WebCam {
    fn new() -> (Self, bool) {
        (WebCam { id: 1u8 }, false)
    }
}

pub fn main() {
    let (cam, is_running) = WebCam::new();
    println!("{} {}", cam.id, is_running);
}

这也有效:

pub struct WebCam {
    id: u8,
}

impl WebCam {
    fn new() -> (Self, bool) {
        (WebCam { id: 1u8 }, false)
    }
}
static mut IS_RUNNING: bool = false;
static mut WEB_CAM: WebCam = WebCam { id: 0u8 };

pub fn main() {
    let (cam, is_running) = WebCam::new();

    unsafe {
        IS_RUNNING = is_running;
        WEB_CAM.id = cam.id;
    }

    println!("{} {}", cam.id, is_running);
}
于 2020-02-04T04:53:49.410 回答