rust - 将本地字符串作为切片返回 (&str)

标签 rust

有几个问题似乎与我遇到的问题相同。例如参见 herehere .基本上,我试图在本地函数中构建一个 String,然后将其作为 &str 返回。切片不起作用,因为生命周期太短。我不能在函数中直接使用 str,因为我需要动态构建它。但是,我也不希望返回 String,因为它所进入的对象的性质在构建后是静态的。有没有办法既吃我的蛋糕又吃它?

这是一个最小的非编译复制:

fn return_str<'a>() -> &'a str {
    let mut string = "".to_string();

    for i in 0..10 {
        string.push_str("ACTG");
    }

    &string[..]
}

最佳答案

不,你不能这样做。至少有两种解释。

首先,请记住引用是借用的,即它们指向某些数据但不拥有它,它属于其他人。在这种特殊情况下,字符串(您要返回的切片)归函数所有,因为它存储在局部变量中。

当函数退出时,它的所有局部变量都被销毁;这涉及调用析构函数,String 的析构函数释放字符串使用的内存。但是,您想要返回一个借用的引用,指向为该字符串分配的数据。这意味着返回的引用立即变为悬空 - 它指向无效内存!

除其他外,Rust 的创建就是为了防止此类问题。因此,在 Rust 中不可能返回指向函数局部变量的引用,这在 C 等语言中是可能的。

还有一种解释,稍微正式一点。让我们看看您的函数签名:

fn return_str<'a>() -> &'a str

请记住,生命周期参数和通用参数是参数:它们由函数的调用者设置。例如,其他一些函数可能会这样调用它:

let s: &'static str = return_str();

这要求 'a'static,但这当然是不可能的 - 你的函数不返回对静态内存的引用,它返回一个引用更短的生命周期。因此这样的函数定义是不合理的,是被编译器禁止的。

无论如何,在这种情况下,您需要返回一个拥有类型的值,在这种特殊情况下,它将是一个拥有的 String:

fn return_str() -> String {
    let mut string = String::new();

    for _ in 0..10 {
        string.push_str("ACTG");
    }

    string
}

关于rust - 将本地字符串作为切片返回 (&str),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45889784/

相关文章:

rust - 如何限制struct的构造?

arrays - 初始化固定长度数组的正确方法是什么?

types - Rust 无法在没有注解的情况下推断类型

rust - 如何从 secp256k1 中提取未压缩的公钥?

assembly - 为什么 rust 在有和没有 pub 和 #[no_mangle] 的情况下会产生完全不同的 assembly ?

for-loop - 如何在 for 循环中进行可变借用?

multithreading - 如何防止自动执行 Sync

time - 如何将 chrono `DateTime<Local>` 实例转换为 `DateTime<Utc>` ?

string - 如何在 Option<T> 中延长 T 的生命周期

rust - 如何让 Cargo 将包的名称/版本保存到 "[dependencies]"文件的 "Cargo.toml"部分?