授予调用者对彼此依赖的局部变量的所有权

时间:2015-04-25 19:33:36

标签: rust

这是我的问题的一个相当小的再现:

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的所有权?

1 个答案:

答案 0 :(得分:1)

(从my answer to a related but still slightly different question复制。)

您正试图将借款归还给该函数创建并归其所有的内容。这不可能。不,没有办法绕过它;你不能以某种方式延长vector的生命周期,返回vector以及借用不起作用。真。这是Rust专门设计为绝对禁止的事情之一。

如果你想从函数中转移一些东西,那么两件事中的一件必须是真的:

  1. 它被存储在函数之外的某个地方,它将比当前调用更长(例如,你被借用作为参数;返回并不算数)。

    要扩展此功能,您可以将功能更改为fn str_to_u8<'a, 'b>(s: &'a str, vector: &'b mut Vec<u8>) -> &'b [u8]。这将允许向量在函数中存活,并允许您安全地将切片返回到它中。

      

    注意:另一个有点代码臭的替代方法是泄漏向量。这涉及forget ting vector并且不安全地将切片投射到&'static [u8]承诺它将永远存在的编译器)。显然,这会泄漏堆分配。

         

    您还可以将vector存储在全局或其他内容中,但这应该是您绝对的最后选择; Rust 讨厌全局。

  2. 您正在归还所有权,而不仅仅是借来的参考。因此,您的函数只会返回Vec<u8>,然后调用者将会切片。