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

时间:2017-02-15 11:43:51

标签: 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);
}

1 个答案:

答案 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);
}