从 `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,
})
}
}
无法编译: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,
})
}
}
那么,是否可以创建一个新的 &'a str
,而不是从将要删除的 String
中借用,而是简单地指向一些具有生命周期的内存 'a
与 String
?
的内容相同
有无数类似的问题,答案只是 return a String
,但假设我无法触及 givesString
的代码或结构 S
这取决于你需要多努力...
在第二个示例中,longlife
是文字 &'static str
。由于 'static
至少与任何 'a
一样长,无论 'a
是什么,通过 S
分配给 return 值是有效的。但是,这在一般情况下不是很有用,因为显而易见的原因您不能修改 &'static str
。
我强烈建议重新构建代码以便有一个所有者,S
似乎是一个候选人。
你 可以 通过 std::mem::forget
完成这项工作:你创建 String
,忘记它并手动派生一个强制的 &'static str
它。这很简单意味着您泄漏了分配的字符串的内存,使其至少与 'a
一样长。大多数人会认为这只是一个错误,或者至少是一个非常丑陋的黑客攻击。但这是可能的。
在一个 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,
})
}
}
无法编译: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,
})
}
}
那么,是否可以创建一个新的 &'a str
,而不是从将要删除的 String
中借用,而是简单地指向一些具有生命周期的内存 'a
与 String
?
有无数类似的问题,答案只是 return a String
,但假设我无法触及 givesString
的代码或结构 S
这取决于你需要多努力...
在第二个示例中,longlife
是文字 &'static str
。由于 'static
至少与任何 'a
一样长,无论 'a
是什么,通过 S
分配给 return 值是有效的。但是,这在一般情况下不是很有用,因为显而易见的原因您不能修改 &'static str
。
我强烈建议重新构建代码以便有一个所有者,S
似乎是一个候选人。
你 可以 通过 std::mem::forget
完成这项工作:你创建 String
,忘记它并手动派生一个强制的 &'static str
它。这很简单意味着您泄漏了分配的字符串的内存,使其至少与 'a
一样长。大多数人会认为这只是一个错误,或者至少是一个非常丑陋的黑客攻击。但这是可能的。