string - 从 `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
解决方案
这取决于你需要多努力……
在第二个示例中,longlife
是文字&'static str
。由于无论如何'static
都至少存在任何时间,因此通过将其分配给返回值是有效的。但是,这在一般情况下并不是很有用,因为出于明显的原因您不能修改 a。'a
'a
S
&'static str
我强烈建议重新构建代码,以便有一个所有者,S
似乎是一个候选人。
您可以通过以下方式完成这项工作std::mem::forget
:您创建String
,忘记它并手动从中获得强制&'static str
。这非常简单地意味着您泄漏了分配的 String 的内存,使其至少与 any 一样长'a
。大多数人会认为这只是一个错误,或者至少是一个非常丑陋、丑陋的黑客。但这是可能的。
推荐阅读
- algorithm - 更改伪代码以便我们摆脱循环
- google-cloud-composer - 无法删除 GCP Cloud Composer 环境
- c - 如何在c中使用多个指向一个二维数组的指针?
- postgresql - pgSQL-INSERT 前触发函数检查是否存在具有相同 ID 的记录
- angular - Angular 8 - 检查后表达式已更改
- algorithm - 寻找无重访图遍历路径(所有顶点)的优化策略
- confluent-platform - 无法在 Arcadia BI 工具中加载 KSQL 表
- flutter - 如何从方法中返回两个值
- r - 在 R 中合并具有许多不匹配列的多个大型数据框
- excel - 修改文件信息的VBA飞跃1小时