返回&str而不是std :: borrow :: Cow <'_,str>

J. *_*ugh 4 string rust

我想更新类型的变量输入&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)

Mat*_* M. 7

不能.


Rust的基石是所有权,这是您需要了解的概念.

&str 借力,但不拥有,它指的是一块内存,别人拥有.借检查器将确保,在编译时,无论谁拥有片的被称为会活存储器更长&str,否则&str将指向入乙醚.

在这种情况下,请考虑:

  • String 是一只猫
  • &str 是一个手持设备运行这只猫的活体饲料(后面是一个微型相机无人机)

显然,只要它存在,你就只能拥有猫的活体饲料,之后,......

你的问题是:

如果我杀了猫,我怎么还能得到活鱼?

你不能.


在你的情况下,re.replace创建一个Cow<'t, str>.如果你看一下你的定义,Cow你会发现它是:

  • 要么a &str
  • 或者a 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)

  • 函数`into`有点难找,因为它是自动实现的.我建议你查看`std :: convert :: From`和它的邪恶双胞胎`std :: convert :: Into`:对于`X :: from(Y) - > X`的任何实现,你得到一个实现`Y :: into(self) - > X`自动神奇. (2认同)