使用正则表达式结果的最佳模式是什么?

时间:2015-07-02 02:25:10

标签: regex rust ownership

我是一个Javascript开发人员正在寻找与Rust的游戏。我已经阅读 The Rust Programming Language ,完成了教程,并使用FFI成功地将Rust添加到节点项目中。我想加快我写的解析器,但我想我错过了一个基本的所有权概念。

当前的挑战很简单:评估命名捕获的正则表达式,并将变量的值更改为新捕获的值。

我已尝试使用unwrap或嵌套ResultOption这十五种方式。它总是归结为“活得不够长”。错误。

我最近的代码如下所示:

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(&current_line) {

        let new_flag = &flag_re.captures(&current_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是短暂的,所以我试过cloneto_owned没有运气,让我确信我对这些概念有些误解。

我尝试使用此代码在Rust游乐场重新创建此代码:

fn main() {
   let mut a: &str;
   {
     let b: &str = "B";
     a = b;  
   }
   println!("a: {} ",a);
}

但是(你不知道)这有效吗?所以请温柔地对待这个Javascript人。

1 个答案:

答案 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,但在此上下文中可能没有必要。