从`String`中获取`&'a str`的​​寿命比当前函数更长的寿命

时间:2019-11-21 17:58:20

标签: string rust lifetime

在返回14的函数中,我创建了一个&'a str。 我想返回一个String,内容与此&'a str

相同
String

playground

不能编译的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 str

playground

因此,是否可以创建一个新的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,但让我们假设我无法触摸String或结构givesString的代码

1 个答案:

答案 0 :(得分:1)

这取决于您需要努力尝试的程度...

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

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

可以通过std::mem::forget来完成此工作:创建String,忘掉它,然后手动从中派生强制&'static str。这很简单,意味着您泄漏了分配的String的内存,使它的生存时间至少与任何'a一样长。大多数人会认为这仅仅是一个错误,或者至少是一个非常丑陋,丑陋的hack。但这是可能的。