使用正则表达式结果的最佳模式是什么?
What is the best pattern for working with regex results?
我是一名 Javascript 开发人员,希望通过 Rust 提升我的水平。我已阅读 Rust 编程语言,完成了教程,并使用 FFI 成功地将 Rust 添加到节点项目中。我想加快我编写的解析器的速度,但我认为我缺少基本的所有权概念。
当前的挑战很简单:评估命名捕获的正则表达式并将变量的值更改为新的捕获值。
我已经使用 unwrap
或嵌套 Result
和 Option
尝试了这十五种方法。它总是归结为 'does not live long enough' 错误。
我最近的代码如下所示:
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
赋值,我就会在 current_line
变量上得到一个 'does not live long enough'。我知道 current_line
是短暂的,所以我尝试了 clone
和 to_owned
但没有成功,这让我确信我对这些概念有一些误解。
我尝试使用以下代码在 Rust 游乐场中重新创建它:
fn main() {
let mut a: &str;
{
let b: &str = "B";
a = b;
}
println!("a: {} ",a);
}
但是(你不知道)这行得通吗?所以请对这个 Javascript 人温柔一点。
问题是new_flag
是从line
借来的。也就是说,只要line
继续存在,new_flag
只能存在。一旦跳出循环,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
,但在这种情况下可能没有必要。
我是一名 Javascript 开发人员,希望通过 Rust 提升我的水平。我已阅读 Rust 编程语言,完成了教程,并使用 FFI 成功地将 Rust 添加到节点项目中。我想加快我编写的解析器的速度,但我认为我缺少基本的所有权概念。
当前的挑战很简单:评估命名捕获的正则表达式并将变量的值更改为新的捕获值。
我已经使用 unwrap
或嵌套 Result
和 Option
尝试了这十五种方法。它总是归结为 'does not live long enough' 错误。
我最近的代码如下所示:
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
赋值,我就会在 current_line
变量上得到一个 'does not live long enough'。我知道 current_line
是短暂的,所以我尝试了 clone
和 to_owned
但没有成功,这让我确信我对这些概念有一些误解。
我尝试使用以下代码在 Rust 游乐场中重新创建它:
fn main() {
let mut a: &str;
{
let b: &str = "B";
a = b;
}
println!("a: {} ",a);
}
但是(你不知道)这行得通吗?所以请对这个 Javascript 人温柔一点。
问题是new_flag
是从line
借来的。也就是说,只要line
继续存在,new_flag
只能存在。一旦跳出循环,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
,但在这种情况下可能没有必要。