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

Loops 如何修改在循环中使用自身的Cow变量?,loops,rust,borrow-checker,borrowing,Loops,Rust,Borrow Checker,Borrowing,我试图删除字符串中的所有括号。不用想太多,我只做了一个简单的regexp替换(也就是说,问题不是特别是如何去掉任意级别的嵌套括号,但是如果您愿意,可以在注释中提出更好的方法) 使用regex::regex; fn main()->结果{ 让输入=“文本(带有一些(嵌套的)括号)!”; 让re=Regex::new(r“\([^()]*\)”)?; 让输出=re.replace_all(&input“”); 让output=re.replace_all(&output“”); //让output=

我试图删除字符串中的所有括号。不用想太多,我只做了一个简单的regexp替换(也就是说,问题不是特别是如何去掉任意级别的嵌套括号,但是如果您愿意,可以在注释中提出更好的方法)

使用regex::regex;
fn main()->结果{
让输入=“文本(带有一些(嵌套的)括号)!”;
让re=Regex::new(r“\([^()]*\)”)?;
让输出=re.replace_all(&input“”);
让output=re.replace_all(&output“”);
//让output=re.replace_all(&output“”);
//让output=re.replace_all(&output“”);
//让output=re.replace_all(&output“”);
//让output=re.replace_all(&output“”);
// ...
断言_eq!(“文本!”,输出);
println!(“作品!”);
好(())
}
因为我不知道括号的嵌套程度,所以我需要在循环中进行替换,而不是“重复足够多次”。然而,创建一个循环会创建一个新的范围,这就是我在与借用检查器的讨论中遇到的死点

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

let mut output=re.replace_all(&input,”);
而re.is_匹配(&输出){
输出=重新替换所有(&output“”);
}
但是,这无法完成,因为我正在为借用的变量赋值:

错误[E0506]:无法分配给'output',因为它是借用的
-->src/main.rs:9:9
|
9 |输出=重新替换|所有(&output“”);
|^^^^-----“output”的借用发生在这里
|         |
|借来的'output'的赋值发生在此处
|借来以后用在这里
理想情况下,我想做的是使用相同的名称创建新的变量绑定,但是使用
let output=
将对外部变量绑定进行阴影处理,因此循环将无限循环

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

这是一个例子

re.replace_all()
返回
Cow

这是问题的根源。编译器知道返回值可能引用
输出
,但也将替换
输出
,导致立即删除
输出
。如果允许,则引用将指向未分配的内存,从而导致内存不安全

解决办法是完全避免借钱

已尝试使用
.to_owned()

to_owned
Cow
上只返回相同的
Cow
。也许你的意思是把变成

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

这同样有效:

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

很遗憾,你没有展示你解决问题的实际尝试,我们本可以帮助你理解为什么它们不起作用。

你用
[in]to_owned()
/
.to_string()
尝试了什么?像这样的@Ry-不。首先,我不知道*to_owned()
中的
*,尽管它也适用于to_string()。其次,当时我很可能已经过度复杂化了,所以我想我没有尝试过(尽管从外观上看,这是有道理的,这是我想要的)。请检查答案,如果没有任何更改,它允许您避免克隆字符串。我可能已经太困了,并且解决方法过于复杂。我以为我尝试了你和@Ry-的建议,但显然我没有。这很有道理,因为这是我试图告诉编译器我正在努力实现的,但我也尝试了一些我知道无法工作的事情。无论如何,非常感谢。