从 `String` 中获取生命周期比当前函数更长的 `&'a str`

Get `&'a str` with longer lifetime than the current function from a `String`

在一个 return 是 &'a str 的函数中,我创建了一个 String。 我想 return 一个 &'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,
        })
    }
}

playground

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

我知道 String 无论如何都会被删除。

但是现在,如果我创建一个 &'a str 并将其传递给 return 值,它编译没有问题:

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,
        })
    }
}

playground

那么,是否可以创建一个新的 &'a str,而不是从将要删除的 String 中借用,而是简单地指向一些具有生命周期的内存 'aString ?

的内容相同

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

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

在第二个示例中,longlife 是文字 &'static str。由于 'static 至少与任何 'a 一样长,无论 'a 是什么,通过 S 分配给 return 值是有效的。但是,这在一般情况下不是很有用,因为显而易见的原因您不能修改 &'static str

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

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