Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vue.js/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 如何在循环中调用正则表达式而不克隆数据_Rust_Borrow Checker_Ownership_Borrowing - Fatal编程技术网

Rust 如何在循环中调用正则表达式而不克隆数据

Rust 如何在循环中调用正则表达式而不克隆数据,rust,borrow-checker,ownership,borrowing,Rust,Borrow Checker,Ownership,Borrowing,我正在编写一些代码来调用N个正则表达式,如果可能的话,我希望避免一直克隆字符串,因为不是每个正则表达式都是匹配的。这可能吗? 我尝试执行的代码是: 使用std::borrow::Cow; 使用regex::regex; fn main(){ let test=“abcde”; 让regexes=vec[ (Regex::new(“a”).unwrap(),“b”), (Regex::new(“b”).unwrap(),“c”), (Regex::new(“z”).unwrap(),“-”, ];

我正在编写一些代码来调用N个正则表达式,如果可能的话,我希望避免一直克隆字符串,因为不是每个正则表达式都是匹配的。这可能吗? 我尝试执行的代码是:

使用std::borrow::Cow;
使用regex::regex;
fn main(){
let test=“abcde”;
让regexes=vec[
(Regex::new(“a”).unwrap(),“b”),
(Regex::new(“b”).unwrap(),“c”),
(Regex::new(“z”).unwrap(),“-”,
];
让mut内容=Cow::借用(测试);
用于正则表达式中的(正则表达式,新值){
contents=regex.replace_all(&contents,new_值);
}
println!(“{}”,目录);
}
预期结果将是
cccde
(如果它起作用)和两个克隆。但为了让它发挥作用,我必须在每次迭代中保持克隆:

fn main() {
    let test = "abcde";
    let regexes = vec![
        (Regex::new("a").unwrap(), "b"),
        (Regex::new("b").unwrap(), "c"),
        (Regex::new("z").unwrap(), "-"),
    ];
    let mut contents = test.to_string();

    for (regex, new_value) in regexes {
        contents = regex.replace_all(&contents, new_value).to_string();
    }
    println!("{}", contents);
}

然后输出
cccde
,但有3个克隆。 有可能以某种方式避免它吗?我知道我可以调用每个正则表达式并重新绑定报税表,但我无法控制可能出现的正则表达式的数量。 提前谢谢

编辑1

对于那些想看到真实代码的人: 它正在执行O(n^2)正则表达式操作。 它从这里开始,并称之为

编辑2
以下是带有接受答案的新代码

您可以在替换字符串时使用字符串作为字符串的持久所有者,并在每次迭代中检查返回的
Cow
是否为所有者。如果它是owned,则您知道替换成功,因此您将
Cow
所拥有的字符串分配到循环变量中

    let mut contents = test.to_owned();
    
    for (regex, new_value) in regexes {
        let new_contents = regex.replace_all(&contents, new_value);
        if let Cow::Owned(new_string) = new_contents {
            contents = new_string;
        }
    }
请注意,Rust中的赋值默认为“移动”-这意味着
new\u string
的值被移动,而不是复制到
内容中


给定的示例和正则表达式是简化的还是单字符替换是您想要完成的?这是否回答了您的问题?我撤回了我的投票,因为我找到了一种方法,我认为这可以不用复制。建议复制的重点是如何最简单地编码,但这个问题的重点是如何在不进行克隆的情况下进行编码,因此我猜它们之间有细微的区别。@Jason check edit 1,我将原始代码放在那里实际上,您不需要交换,使用
contents=new\u string
(并且去掉
mut new_string
中的
mut
)也有效,因为它只是将字符串从不再需要的新内容中移出。感谢您的回答!我将对问题中指定的代码应用以下更改(选中编辑1)谢谢,HHK,我在想什么?这就是C++和生锈思维之间转换太快的原因。