13
votes

I ran into an error:

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);
}

The error:

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

For me, the code can do no wrong, though. Why am I having that error?

1
Note that let a: [u8, ..30] = [ 123, 34, ... ]; can be onerous as you have to adapt the length whenever you change the array. If you wish to document the length, this is fine, if you do not need it and feel the pain though, there is another way to express this: let a = [123u8, 34, ...];. The key is that 123 and 34 are just generic integrals (no specific type), so you are constraining them by specifying u8; however, because arrays are homogenous containers, another solution is to constrain the type of one (the first, typically, so 123u8) and the compiler deduces that all are u8!Matthieu M.

1 Answers

18
votes

The problem here is that you are not storing the result of from_base64 anywhere and then take a reference to it by calling as_slice. Chaining calls like that causes the result of from_base64 to go out of scope at the end of the line and the reference taken is no longer valid.

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());
}