在返回14
的函数中,我创建了一个&'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 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
,但让我们假设我无法触摸String
或结构givesString
的代码
答案 0 :(得分:1)
这取决于您需要努力尝试的程度...
在第二个示例中,longlife
是文字&'static str
。由于'static
的寿命至少与任何'a
一样长,无论'a
是什么,因此通过S
分配给返回值是有效的。不过,这在一般情况下不是很有用,因为您出于明显的原因不能修改&'static str
。
我强烈建议重新组织代码,以便有一个所有者,S
似乎是一个候选人。
您可以通过std::mem::forget
来完成此工作:创建String
,忘掉它,然后手动从中派生强制&'static str
。这很简单,意味着您泄漏了分配的String的内存,使它的生存时间至少与任何'a
一样长。大多数人会认为这仅仅是一个错误,或者至少是一个非常丑陋,丑陋的hack。但这是可能的。