5

I've written some rust code which has a lifetime problem.

let mut sha256 = Sha256::new();
sha256.input_str(input.as_slice());

for i in range(0i,16) {
    println!("i == {}, hash == {}", i, sha256.result_str());
    let bytes = sha256.result_bytes().as_slice();
    sha256.input(bytes);
}

The error is:

$ cargo build && ./target/hello_world asdfasdf
   Compiling hello_world v0.1.0 (file:///home/chris/hello_world)
src/hello_world.rs:41:21: 41:42 error: borrowed value does not live long enough
src/hello_world.rs:41         let bytes = sha256.result_bytes().as_slice();
                                          ^~~~~~~~~~~~~~~~~~~~~
src/hello_world.rs:39:27: 43:6 note: reference must be valid for the block at 39:26...
src/hello_world.rs:39     for i in range(0i,16) {
src/hello_world.rs:40         println!("i == {}, hash == {}", i, sha256.result_str());
src/hello_world.rs:41         let bytes = sha256.result_bytes().as_slice();
src/hello_world.rs:42         sha256.input(bytes);
src/hello_world.rs:43     }
src/hello_world.rs:41:9: 41:53 note: ...but borrowed value is only valid for the statement at 41:8; consider using a `let` binding to increase its lifetime
src/hello_world.rs:41         let bytes = sha256.result_bytes().as_slice();
                              ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
error: aborting due to previous error
Could not compile `hello_world`.

To learn more, run the command again with --verbose.

How can I alter this, and still let it execute efficiently?

1

1 Answer 1

6

That's because the result from result_bytes() is being discarded after that line and as_slice() is getting a reference to it. The borrow checker won't let it happen.

For it to work you should write it like:

let mut sha256 = Sha256::new();
sha256.input_str(input.as_slice());

for i in range(0i,16) {
    println!("i == {}, hash == {}", i, sha256.result_str());
    let bytes = sha256.result_bytes();
    sha256.reset();
    sha256.input(bytes.as_slice());
}

Hope it helped.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.