gpt4 book ai didi

loops - 如何修改在循环中使用自身的 Cow 变量?

转载 作者:行者123 更新时间:2023-11-29 08:29:02 27 4
gpt4 key购买 nike

我正在尝试删除字符串中的所有括号。没有考虑太难,我只是做了一个简单的正则表达式替换(即问题不是特别是关于摆脱任意级别的嵌套括号,但如果你愿意,请随时在评论中提出更好的方法).

use regex::Regex;

fn main() -> Result<(), Box<dyn std::error::Error>> {
let input = "Text (with some (nested) parentheses)!";
let re = Regex::new(r"\([^()]*\)")?;

let output = re.replace_all(&input, "");
let output = re.replace_all(&output, "");
// let output = re.replace_all(&output, "");
// let output = re.replace_all(&output, "");
// let output = re.replace_all(&output, "");
// let output = re.replace_all(&output, "");
// ...

assert_eq!("Text !", output);

println!("Works!");

Ok(())
}

因为我不知道括号的嵌套程度,所以我需要在循环中进行替换,而不是重复“刚好足够的次数”。然而,创建一个循环会创建一个新的范围,这就是我在与借用检查器的讨论中遇到的死点。

显示我在循环中尝试做的事情的最简单的情况是:

    let mut output = re.replace_all(&input, "");
while re.is_match(&output) {
output = re.replace_all(&output, "");
}

但是这无法完成,因为我正在分配给借用的变量:

error[E0506]: cannot assign to `output` because it is borrowed
--> src/main.rs:9:9
|
9 | output = re.replace_all(&output, "");
| ^^^^^^ ------- borrow of `output` occurs here
| |
| assignment to borrowed `output` occurs here
| borrow later used here

理想情况下,我想做的是创建具有相同名称的新变量绑定(bind),但使用 let output = 会隐藏外部变量绑定(bind),因此循环将无限循环。

无论我创建什么内部或外部临时变量,我都不能让它做我想做的事。我还尝试使用 re.replace_all() 返回 Cow 并尝试使用 .to_owned().to_string() 在几个地方,但这也没有帮助。

这是一个 link to a playground .

最佳答案

re.replace_all() returns Cow

这就是问题的根源。编译器知道返回值可能引用output,但它也会替换output,导致output是马上就掉了。如果它允许这样做,引用将指向未分配的内存,从而导致内存不安全。

解决方案是完全避免借用。

tried using .to_owned()

Cow 上的

to_owned 只会返回相同的 Cow。也许您的意思是 into_owned

let mut output = re.replace_all(&input, "").into_owned();
while re.is_match(&output) {
output = re.replace_all(&output, "").into_owned();
}

and .to_string() in a couple of places

这也适用:

let mut output = re.replace_all(&input, "").to_string();
while re.is_match(&output) {
output = re.replace_all(&output, "").to_string();
}

关于loops - 如何修改在循环中使用自身的 Cow 变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55670511/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com