【发布时间】:2020-03-07 18:13:42
【问题描述】:
我的目标是保留一个静态变量并让 CLI 参数覆盖该值,但我很难找到一种方法来保留从 args 迭代器获得的值的静态副本。
static mut ROOT_DIRECTORY: &str = "C:\\test\\source";
fn main() {
let args: Vec<String> = env::args().collect();
let mut index = 0;
for arg in args {
match arg.as_str() {
"/r" => unsafe {
if args_length <= index + 1 {
panic!("Missing root directory value.");
}
ROOT_DIRECTORY = args.get(index + 1).unwrap();
if ROOT_DIRECTORY.is_empty() {
panic!("Root directory value cannot be empty.")
}
}
}
}
}
给出以下编译错误
error[E0597]: `args` does not live long enough
--> src\main.rs:90:34
|
90 | ROOT_DIRECTORY = args.get(index + 1).unwrap();
| ^^^^---------------
| |
| borrowed value does not live long enough
| argument requires that `args` is borrowed for `'static`
...
168 | }
| - `args` dropped here while still borrowed
error[E0382]: borrow of moved value: `args`
--> src\main.rs:90:34
|
54 | let args: Vec<String> = env::args().collect();
| ---- move occurs because `args` has type `std::vec::Vec<std::string::String>`, which does not implement the `Copy` trait
...
76 | for arg in args {
| ----
| |
| value moved here
| help: consider borrowing to avoid moving into the for loop: `&args`
...
90 | ROOT_DIRECTORY = args.get(index + 1).unwrap();
|
我有什么方法可以从迭代器中创建值的静态副本吗?
【问题讨论】:
-
args 列表中传递的内容不能存在于静态内存中;静态内存用于在程序执行期间存在的数据,用于作为程序二进制文件的一部分的数据。你能告诉我们你想要做什么而不是你想要编码吗?
-
这毫无意义。静态内存适用于进程的生命周期,并且肯定会在应用程序执行期间发生变化。为什么不能提升一块内存不空闲?
-
对不起,我的意思不是静态内存不能改变,它可以在 Rust 中不安全地改变。但是 arg 或 args 没有静态生命周期,因此不能保证在程序期间存在。
标签: rust static borrow-checker borrowing