首页 > 解决方案 > 从 `String` 中获取 `&'a str` 的生命周期比当前函数更长

问题描述

在返回 a 的函数中&'a str,我创建了一个String. 我想返回一个&'a str与这个相同的内容String

fn givesString(A: &str) -> String {
    String::from("example")
}

pub struct S<'a> {
    pub strField: &'a str,
}
impl<'a> S<'a> {
    pub fn from_String_A(A: &'a str) -> Result<Self, Box<dyn std::error::Error>> {
        let processed_String = givesString(&A);
        let processed_str: &'a str = a_processed_String.as_str();

        Ok(Self {
            strField: processed_str,
        })
    }
}

操场

不编译:borrowed value a_processed_String does not live long enough, 因为它在函数末尾被删除。

我明白String无论如何都会放弃。

但是现在,如果我创建 a&'a str并将其传递给返回值,它就可以毫无问题地编译:

fn givesString(A: &str) -> String {
    String::from("example")
}

pub struct S<'a> {
    pub strField: &'a str,
}
impl<'a> S<'a> {
    pub fn from_String_A(A: &'a str) -> Result<Self, Box<dyn std::error::Error>> {
        let longlife: &'a str = "hello from the outside of this fn";

        Ok(Self {
            strField: longlife,
        })
    }
}

操场

那么,是否有可能创建一个新&'a str的,而不是从将要删除的那个中借用,而String只是指向一些具有与'a该相同内容的生命周期的内存String

有无数类似的问题,答案是简单地返回 a String,但假设我无法触及代码givesString或结构S

标签: stringrustlifetime

解决方案


这取决于你需要多努力……

在第二个示例中,longlife是文字&'static str。由于无论如何'static都至少存在任何时间,因此通过将其分配给返回值是有效的。但是,这在一般情况下并不是很有用,因为出于明显的原因您不能修改 a。'a'aS&'static str

我强烈建议重新构建代码,以便有一个所有者,S似乎是一个候选人。

可以通过以下方式完成这项工作std::mem::forget:您创建String,忘记它并手动从中获得强制&'static str。这非常简单地意味着您泄漏了分配的 String 的内存,使其至少与 any 一样长'a。大多数人会认为这只是一个错误,或者至少是一个非常丑陋、丑陋的黑客。但这是可能的。


推荐阅读