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