Как установить время жизни stati c для возвращаемого кортежа в Rust? - PullRequest
0 голосов
/ 04 февраля 2020

Предположим, у меня есть следующий конструктор, который возвращает кортеж:

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();
}

Приведенный выше код не компилируется. Тем не менее, если я изменяю static на let, он компилируется очень хорошо Я не уверен, как установить время жизни для отдельных значений возвращаемого кортежа (в одну строку)?

1 Ответ

1 голос
/ 04 февраля 2020

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

Может быть непонятно, стоит ли использовать постоянный предмет или статический c предмет. В общем случае константы должны быть предпочтительнее статики, если не выполняется одно из следующих условий:

Хранятся большие объемы данных
Требуется свойство одноадресности статики.
Внутренняя изменчивость требуется.

Элемент stati c похож на константу, за исключением того, что он представляет точное место памяти в программе. Все ссылки на данные c относятся к одной и той же ячейке памяти. Stati c элементы имеют время жизни stati c, которое превосходит все другие времена жизни в программе Rust. Элементы non-mut stati c, которые содержат тип, который не может изменяться внутри, могут быть помещены в постоянную память. Элементы Stati c не вызывают drop в конце программы.

Весь доступ к stati c безопасен, но есть ряд ограничений для статики:

type должен иметь черту Syn c, привязанную, чтобы обеспечить потокобезопасный доступ. Статика позволяет использовать пути к статике в константном выражении, используемом для их инициализации, но статика может не ссылаться на другие статики по значению, только через ссылку. Константы не могут ссылаться на статику.

Я бы переписал ваш код следующим образом:

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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...