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

标签 string rust lifetime

<分区>

在返回 &'a str 的函数中,我创建了一个 String。 我想返回一个与此 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 processed_String = givesString(&A);
        let processed_str: &'a str = a_processed_String.as_str();

        Ok(Self {
            strField: processed_str,
        })
    }
}

playground

无法编译:借用的值 a_processed_String 生存时间不够长,因为它在函数末尾被丢弃。

我知道 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,
        })
    }
}

playground

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

相同

有无数类似的问题,答案是简单地返回一个 String,但假设我不能触及 givesString 的代码或结构 S

最佳答案

这取决于你需要多努力去尝试......

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

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

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

关于string - 从 `&' 中获取比当前函数更长生命周期的 str` `String`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58981039/

相关文章:

Rust:条件特征继承

rust - rustc-std-workspace-core crate 的用途是什么?

rust - 函数返回 serde 反序列化类型时如何修复生命周期错误?

rust - 为什么不能在同一结构中存储值和对该值的引用?

rust - 如何为构建器提供可变引用,但仅提供对构建对象的不可变引用?

string - 如何在 ColdFusion 中输出八进制值

python - Python 3.0 中带有空字符串的 "IN"运算符

string - z算法的实现

java - 统计一个字符被输入的次数

Rust 模式与现有绑定(bind)匹配?