使用as_slice()时"借来的值不够长"

アレッ*_*ックス 12 rust borrow-checker

我遇到了一个错误:

extern crate rustc_serialize; // 0.3.24

use rustc_serialize::base64::{self, FromBase64, ToBase64};

fn main() {
    let a: [u8; 30] = [0; 30];
    let b = a.from_base64().unwrap().as_slice();
    println!("{:?}", b);
}
Run Code Online (Sandbox Code Playgroud)

错误:

error[E0597]: borrowed value does not live long enough
 --> src/main.rs:7:13
  |
7 |     let b = a.from_base64().unwrap().as_slice();
  |             ^^^^^^^^^^^^^^^^^^^^^^^^           - temporary value dropped here while still borrowed
  |             |
  |             temporary value does not live long enough
8 |     println!("{:?}", b);
9 | }
  | - temporary value needs to live until here
  |
  = note: consider using a `let` binding to increase its lifetime
Run Code Online (Sandbox Code Playgroud)

不过,对我来说,代码没有错.为什么我有这个错误?

Arj*_*jan 16

这里的问题是你没有存储from_base64任何地方的结果,然后通过调用来引用它as_slice.链接这样的调用会导致结果from_base64超出行尾,并且所引用的引用不再有效.

extern crate rustc_serialize; // 0.3.24

use rustc_serialize::base64::FromBase64;

fn main() {
    let a: [u8; 30] = [0; 30];
    let b = a.from_base64().unwrap();
    println!("{:?}", b.as_slice());
}
Run Code Online (Sandbox Code Playgroud)

  • `这里的问题是你没有将from_base64的结果存储在任何地方然后通过调用as_slice来引用它 - 为什么?我可以用几乎任何其他编程语言来做到这一点,它会起作用. (6认同)