我是一个Javascript开发人员正在寻找与Rust的游戏。我已经阅读 The Rust Programming Language ,完成了教程,并使用FFI成功地将Rust添加到节点项目中。我想加快我写的解析器,但我想我错过了一个基本的所有权概念。
当前的挑战很简单:评估命名捕获的正则表达式,并将变量的值更改为新捕获的值。
我已尝试使用unwrap
或嵌套Result
和Option
这十五种方式。它总是归结为“活得不够长”。错误。
我最近的代码如下所示:
let flag_re = compile_re(r"(?:\s*)([~])(?:\s*)(?P<FLAG>.)");
let mut flag : &str = "V";
for line in file.lines() {
let mut current_line : String = line.unwrap();
if flag_re.is_match(¤t_line) {
let new_flag = &flag_re.captures(¤t_line).unwrap().name("FLAG").unwrap().clone();
println!("old flag: {} new flag: {}",flag,new_flag);
flag = new_flag;
}
如果我注释掉flag = new_flag
行,这会很有效。但是,一旦我尝试将值分配给flag
,我就会得到一个“不能活得足够长的时间”#39;在current_line
变量上。我知道current_line
是短暂的,所以我试过clone
和to_owned
没有运气,让我确信我对这些概念有些误解。
我尝试使用此代码在Rust游乐场重新创建此代码:
fn main() {
let mut a: &str;
{
let b: &str = "B";
a = b;
}
println!("a: {} ",a);
}
但是(你不知道)这有效吗?所以请温柔地对待这个Javascript人。
答案 0 :(得分:2)
问题在于new_flag
来自line
。也就是说,只要new_flag
继续存在,line
只能存在 。一旦你退出循环,line
将被销毁。
处理此问题的最简单方法是从借用的字符串(&str
)切换到拥有的字符串(String
)。也就是说,您需要一个拥有其内容的值,以便不会在游戏中借用。适当的改变是:
let mut flag = String::from("V"); // One way of constructing a String from a &str
...
flag = new_flag.into(); // Another way, using inference
稍微更有效的替代方法是使用std::borrow::Cow
,但在此上下文中可能没有必要。