为什么这个变量的寿命不够长?
why doesn't this variable live long enough?
我正在尝试从 getopts
中提取一个可选的 arg,但对于变量 s
.
来说,借用的值的寿命不够长错误
代码:
let cfgFilePath = match matches.opt_str("c") {
Some(s) => Some(Path::new(&s.clone())),
None => None
};
错误:
main.rs:29:36: 29:45 error: borrowed value does not live long enough
main.rs:29 Some(s) => Some(Path::new(&s.clone())),
^~~~~~~~~
main.rs:31:7: 65:2 note: reference must be valid for the block suffix following statement 10 at 31:6...
main.rs:31 };
main.rs:32 let tmpdir = Path::new(&matches.opt_str("t").unwrap_or("/tmp/".to_string()));
main.rs:33 let name = matches.opt_str("n").unwrap_or_else(||{
main.rs:34 print_usage(&program, opts);
main.rs:35 panic!("error: -n NAME required");
main.rs:36 });
...
无论 .clone()
、.to_owned()
、.to_str()
或我想尝试的任何其他方法,都会发生这种情况。
因为 Path::new(&x)
returns 一个 &Path
从 x
.
借用了它的内容
Some(s) => Some(Path::new(&s.clone())), // Type is Option<&Path>
// reborrow --------------^
您真正想要做的是使用 PathBuf
(拥有的 Path
等价物)。 PathBuf
将取得 s
的所有权,而不是借用它。
let cfgFilePath = match matches.opt_str("c") {
Some(s) => Some(PathBuf::from(s)),
None => None
};
我正在尝试从 getopts
中提取一个可选的 arg,但对于变量 s
.
代码:
let cfgFilePath = match matches.opt_str("c") {
Some(s) => Some(Path::new(&s.clone())),
None => None
};
错误:
main.rs:29:36: 29:45 error: borrowed value does not live long enough
main.rs:29 Some(s) => Some(Path::new(&s.clone())),
^~~~~~~~~
main.rs:31:7: 65:2 note: reference must be valid for the block suffix following statement 10 at 31:6...
main.rs:31 };
main.rs:32 let tmpdir = Path::new(&matches.opt_str("t").unwrap_or("/tmp/".to_string()));
main.rs:33 let name = matches.opt_str("n").unwrap_or_else(||{
main.rs:34 print_usage(&program, opts);
main.rs:35 panic!("error: -n NAME required");
main.rs:36 });
...
无论 .clone()
、.to_owned()
、.to_str()
或我想尝试的任何其他方法,都会发生这种情况。
因为 Path::new(&x)
returns 一个 &Path
从 x
.
Some(s) => Some(Path::new(&s.clone())), // Type is Option<&Path>
// reborrow --------------^
您真正想要做的是使用 PathBuf
(拥有的 Path
等价物)。 PathBuf
将取得 s
的所有权,而不是借用它。
let cfgFilePath = match matches.opt_str("c") {
Some(s) => Some(PathBuf::from(s)),
None => None
};