将本地string作为切片(&str)
有几个问题似乎是关于我有同样的问题。 例如看到这里和这里 。 基本上我试图在本地函数中build立一个String
,但是然后返回它作为&str
。 切片不工作,因为寿命太短。 我不能直接在函数中使用str
,因为我需要dynamic构build它。 但是,我也不想返回一个String
因为这个对象的性质在构build之后是静态的。 有没有办法让我的蛋糕也吃了吗?
这是一个最小的非编译复制:
fn return_str<'a>() -> &'a str { let mut string = "".to_string(); for i in 0..10 { string.push_str("ACTG"); } &string[..] }
不,你做不到。 至less有两个解释为什么是这样的。
首先,请记住,引用是借来的,即它们指向一些数据,但不拥有它,它是由别人拥有的。 在这种特殊情况下,string(您想要返回的切片)由该函数拥有,因为它存储在局部variables中。
当函数退出时,所有的局部variables都被销毁; 这涉及调用析构函数,并且String
的析构函数释放string使用的内存。 但是,您希望返回指向为该string分配的数据的借用引用。 这意味着返回的引用立即变成悬摆 – 它指向无效的内存!
除了一切之外,Rust都是为了防止这种问题而创build的。 因此,在Rust中,不可能返回一个指向函数局部variables的引用,这在C语言中是可能的。
还有另一种解释,稍微正式。 我们来看看你的函数签名:
fn return_str<'a>() -> &'a str
请记住,生命周期和通用参数是参数,它们是由函数的调用者设置的。 例如,其他一些函数可能会这样调用它:
let s: &'static str = return_str();
这要求'a
'static
,但当然是不可能的 – 你的函数不会返回一个静态内存的引用,它会返回一个严格的更less的引用。 因此这样的函数定义是不健全的,并且被编译器所禁止。
无论如何,在这种情况下,你需要返回一个拥有types的值,在这种情况下,它将是一个拥有的String
:
fn return_str() -> String { let mut string = String::new(); for _ in 0..10 { string.push_str("ACTG"); } string }