这是我的问题的一个相当小的再现:
fn str_to_u8(s: &str) -> &[u8] {
let vector = s.chars().map(|c| c as u8).collect::<Vec<u8>>();
let slice = vector.as_slice();
slice
}
编译器说vector
的寿命不够长,这是有道理的。有没有办法强制vector
“移动”到slice
,这样当调用者获得切片的所有权时,它还拥有vector
的所有权?
答案 0 :(得分:1)
(从my answer to a related but still slightly different question复制。)
您正试图将借款归还给该函数创建并归其所有的内容。这不可能。不,没有办法绕过它;你不能以某种方式延长vector
的生命周期,返回vector
以及借用不起作用。真。这是Rust专门设计为绝对禁止的事情之一。
如果你想从函数中转移一些东西,那么两件事中的一件必须是真的:
它被存储在函数之外的某个地方,它将比当前调用更长(例如,你被借用作为参数;返回并不算数)。
要扩展此功能,您可以将功能更改为fn str_to_u8<'a, 'b>(s: &'a str, vector: &'b mut Vec<u8>) -> &'b [u8]
。这将允许向量在函数中存活,并允许您安全地将切片返回到它中。
注意:另一个有点代码臭的替代方法是泄漏向量。这涉及
forget
tingvector
并且不安全地将切片投射到&'static [u8]
(即承诺它将永远存在的编译器)。显然,这会泄漏堆分配。您还可以将
vector
存储在全局或其他内容中,但这应该是您绝对的最后选择; Rust 讨厌全局。
您正在归还所有权,而不仅仅是借来的参考。因此,您的函数只会返回Vec<u8>
,然后调用者将会切片。