我想更新类型的变量输入&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);
}
Run Code Online (Sandbox Code Playgroud)
你不能.
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);
}
Run Code Online (Sandbox Code Playgroud)