Вы не можете этого сделать. Переменные Stati c должны быть 'static
, то есть не должны содержать не 'static
времени жизни. Вот почему вы можете указать срок службы в декларации о ссылках. Ваша на самом деле эквивалентна:
static mut ROOT_DIRECTORY: &'static str = "C:\\test\\source";
А ваша args
является локальной переменной, поэтому ссылка на нее не 'static
.
Есть ли способ для мне создать stati c копию значения из итератора?
Самый простой вариант - присвоить переменной stati c свои данные, а не ссылаться, то есть пусть это будет String
. К сожалению, конструктор stati c должен быть const
, и единственный известный мне const
конструктор String
- String::new()
. Вы можете добавить вспомогательную функцию fn get_root_directory() -> &'static str
, которая считывает глобальную переменную и возвращает значение по умолчанию, если оно не установлено, но если вам это нужно, вы можете сделать следующее: c a Option<String>
:
static mut ROOT_DIRECTORY: Option<String> = None;
pub fn get_root_directory() -> &'static str {
unsafe {
ROOT_DIRECTORY.as_deref().unwrap_or("C:\\test\\source")
}
}
Другим вариантом может быть утечка выделенной в куче строки, чтобы сделать ее stati c. Пока вы назначаете его только один раз, утечка не должна быть проблемой. Что-то вроде:
static mut ROOT_DIRECTORY: &'static str = "default value";
fn main() {
let x = "...".to_string();
unsafe {
ROOT_DIRECTORY = Box::leak(x.into_boxed_str());
}
}