我想更新&str
类型的变量输入。如何使内部函数返回&str
而不是Cow
?
这可能不是语言的问题,而是正则表达式。有没有更直接的?
fn transform_the_expression() {
fn create_formula<'t>(input: &'t str, re: Regex) -> std::borrow::Cow<'t, str> {
let changed_string = re.replace(input, "1");
return changed_string;
}
let mut input = "(a+(b*c))";
use regex::Regex;
let re = Regex::new(r"\([\w\d][/*+-^][\w\d]\)").unwrap();
println!("input = {:?}", input);
input = create_formula(input, re);
println!("input = {:?}", input);
}
答案 0 :(得分:7)
你不能。
Rust的基石是所有权,这是您需要了解的概念。
&str
借用但拥有,它指的是其他人拥有的一块内存。借用检查器将在编译时确保拥有所提及的内存的任何人将更长而不是&str
,否则&str
将指向以太。
在这种情况下,请考虑:
String
是一只猫&str
是一个手持设备,运行这只猫的实时饲料(后面是一个小型无人机)显然,只要生活,你就只能拥有猫的实时饲料,之后......
你的问题是:
如果我杀了猫,我怎么还能得到一个活鱼?
你不能。
在您的情况下,re.replace
会创建Cow<'t, str>
。如果你看一下Cow
的定义,你会发现它是:
&str
String
如果没有替换,则只有&str
,否则为String
。
你无法静态地知道它是什么,因此你需要考虑“最坏情况”的替代方案:将其视为String
。
这个String
的生命周期是什么:它取决于你是否从函数返回它,如果你不这样做,它就不能比函数的框架寿命更长。
如果它不比功能框架寿命长,你就不能拥有比功能框架更长的实时信息。
因此?
我的建议是使用String
。它会变得非常简单:
fn transform_the_expression() {
use regex::Regex;
fn create_formula(input: &str, re: &Regex) -> String {
re.replace(input, "1").into()
}
let mut input = String::from("(a+(b*c))");
let re = Regex::new(r"\([\w\d][/*+-^][\w\d]\)").unwrap();
println!("input = {:?}", input);
input = create_formula(&input, &re);
println!("input = {:?}", input);
}