但它没有从中借来的价值

时间:2014-12-02 10:30:18

标签: rust

我的代码简化版本如下所示:

fn main() {
  method1(true);
}

fn method1(cond: bool) -> (&[u8], String) {
  let ret1 = if cond {
    let a = "a string in base64".as_bytes().from_base64();
    a.unwrap().as_slice()
  } else {
    [] // how can I return an empty array? Should I return vector instead?
  };

  (ret1, "aaa".to_string())
}

错误:

error: missing lifetime specifier [E0106]
test1.rs:7 fn method1(cond: bool) -> (&[u8], String) {
                                      ^~~~~
test1.rs:7:28: 7:33 help: this function's return type contains a borrowed value, but there is no value for it to be borrowed from
test1.rs:7 fn method1(cond: bool) -> (&[u8], String) {
                                      ^~~~~
test1.rs:7:28: 7:33 help: consider giving it a 'static lifetime
test1.rs:7 fn method1(cond: bool) -> (&[u8], String) {
                                      ^~~~~
error: aborting due to previous error

底线是,我想从一个方法返回一个数组的元组和一个字符串(String或& str),我该怎么做?

1 个答案:

答案 0 :(得分:6)

你不能。

你可以这样做:

fn main() {
  method1(true);
}

fn method1(cond: bool) -> (&'static [u8], String) {
  // ' <-- un-confuse SO syntax highlighting...
  let ret1 = if cond {
    b"some hard-coded data"
  } else {
    b""
  };

  (ret1, "aaa".to_string())
}
  

注意b"..."只是创建&'static [u8]值的简写语法。

但是你不能返回对不属于函数之外的数据的数据的引用。如果数据不是静态知道的,那么是的,您必须返回Vec<u8>才能通过所有权。

修改以在评论中解决问题。

其他不起作用的事情:

  • fn method1<'a>... - 首先,这并没有改变传递引用的事实,你必须指的是在函数退出后仍然存在的东西。在全局变量之外(你应该永远不会使用,特别是在这样的情况下),没有办法在函数之外存在一个长期存在的值。您拥有以返回拥有其内容的值,并且永远不会成为借用。

    声明一个通用的生命周期参数不会改变它。

  • &([u8], String) - 这是无效的。首先,它与原来的问题完全相同:你不能将借款归还给你创造的东西。其次,它包含[u8],这是一个动态大小的类型。元组中不能有动态大小的类型;我们认为有效的唯一位置(我知道)位于结构的最后, 使结构本身变为动态大小。您无法传递,返回或存储动态大小的值。

  • (&[u8], &str) - 这与原来的问题相同,只是现在第二个元组值借用了。有些情况下,编译器可以猜测你的生命周期,但这不是其中之一(我不想在这里进入生命周期省略规则的描述)。