2014-10-30 17 views
11

tôi chạy vào một lỗi:"giá trị vay không sống đủ lâu" khi sử dụng as_slice()

extern crate serialize; 

use serialize::base64::{mod, ToBase64, FromBase64}; 

fn main() { 

    let a: [u8, ..30] = [123, 34, .....]; 
    let b = a.from_base64().as_slice(); 
    println!("{}", b); 
} 

Lỗi:

error: borrowed value does not live long enough 
let b = a.from_base64().as_slice(); 

Đối với tôi, các mã có thể làm không sai, Tuy nhiên. Tại sao tôi gặp lỗi đó?

+1

Lưu ý rằng 'let a: [u8, ..30] = [123, 34, ...];' có thể phù hợp khi bạn phải điều chỉnh độ dài bất cứ khi nào bạn thay đổi mảng. Nếu bạn muốn ghi lại chiều dài, điều này là tốt, nếu bạn không cần nó và cảm thấy đau đớn, mặc dù có một cách khác để diễn tả điều này: 'let a = [123u8, 34, ...];'. Điều quan trọng là '123' và' 34' chỉ là tích phân chung (không có loại cụ thể), vì vậy bạn đang hạn chế chúng bằng cách chỉ định 'u8'; tuy nhiên, vì mảng là các thùng chứa đồng nhất, nên một giải pháp khác là hạn chế loại một (đầu tiên, thông thường, vì vậy '123u8') và trình biên dịch suy luận rằng tất cả đều là' u8'! –

Trả lời

14

Vấn đề ở đây là bạn không lưu trữ kết quả của from_base64 ở bất kỳ đâu và sau đó tham chiếu đến bằng cách gọi as_slice. Các cuộc gọi giống như vậy gây ra kết quả của from_base64 để thoát khỏi phạm vi ở cuối dòng và tham chiếu mất không còn giá trị.

Đồng thời, hãy cẩn thận khi gọi as_slice trên Result vì trong trường hợp lỗi giải mã, chương trình sẽ gây hoảng loạn và làm hỏng chương trình.

extern crate serialize; 

use serialize::base64::{mod, ToBase64, FromBase64}; 

fn main() { 

    let a: [u8, ..30] = [123, 34, .....]; 
    let b = a.from_base64(); 
    println!("{}", b.as_slice()); 
    // <-- b's (result of from_base64) lifetime now ends here 
} 
+5

'Vấn đề ở đây là bạn không lưu trữ kết quả của from_base64 ở bất cứ nơi nào và sau đó tham chiếu đến là bằng cách gọi as_slice' - tại sao? Tôi có thể làm điều đó bằng nhiều ngôn ngữ lập trình khác và nó sẽ hoạt động. –

+1

Đây là cách hiện tại, [RFC31] (https://github.com/kballard/rfcs/blob/2d3ff42b821ab80bd6a7b3b8fda0e1c238cc7de0/active/0000-better-temporary-lifetimes.md) sẽ sửa lỗi này. – Arjan

+0

Vì vậy, mặc dù a.from_base64() không thay đổi 'a' và tạo ra một biến mới, nó không phải bây giờ trong Rust? –

Các vấn đề liên quan