【问题标题】:What is the best pattern for working with regex results?使用正则表达式结果的最佳模式是什么?
【发布时间】:2015-09-19 09:35:17
【问题描述】:

我是一名 Javascript 开发人员,希望通过 Rust 来提升我的游戏水平。我已阅读 Rust 编程语言,完成了教程,并成功地将 Rust 添加到使用 FFI 的节点项目中。我想加快我编写的解析器的速度,但我认为我缺少基本的所有权概念。

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

我已经使用unwrap 或嵌套Results 和Options 尝试了这十五种方法。它总是归结为“活得不够长”的错误。

我最近的代码如下所示:

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 分配一个值,我就会在current_line 变量上得到一个“活得不够长”。我知道current_line 是短暂的,所以我尝试了cloneto_owned,但没有运气,这让我确信我对这些概念有一些误解。

我尝试使用以下代码在 Rust 操场上重新创建它:

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

但是(你不知道)这行得通吗?所以请对这个 Javascript 家伙温柔一点。

【问题讨论】:

    标签: regex rust ownership


    【解决方案1】:

    问题是new_flag是从line借来的。也就是说,只要line 继续存在,new_flag只能存在。一旦脱离循环,line 就会被销毁。

    处理此问题的最简单方法是从借用字符串 (&amp;str) 切换到 owned 字符串 (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,但在这种情况下这可能是不必要的。

    【讨论】:

    • 谢谢。更改为 String 有效。我确实必须使用:`'flag = new_flag.**to_string()**.into();'` 我认为这是由于 new_flag 的乘积是 &str.
    • 更正:.to_string() 是不必要的。注意 new_flag 赋值中的错误 &。很抱歉造成混乱,再次感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 2013-03-16
    • 2015-07-21
    • 2016-05-18
    • 2013-08-21
    • 2012-11-23
    • 1970-01-01
    • 2010-12-06
    • 2011-06-15
    相关资源
    最近更新 更多