2015-07-06 16 views
11

Tôi có một chút mã mà tôi đang chiến đấu. Đó là một hàm trợ giúp nhỏ sẽ trả về một hàm Vec<&str> cho hàm gọi. Mặc dù tôi dường như không thể có được cả cuộc đời.Mở rộng Rust Lifetime

Dưới đây là đoạn mã:

fn take_symbol<'a>(ch: &'a str, current: &'a mut String) -> &'a mut TokenList<'a> { 
    let out = TokenList::<'a>::new(); 

    out.push(current.as_str()); 
    out.push(ch); 

    *current = String::new(); 

    &mut out 
} 

Trình biên dịch là nói cho tôi: error: 'out' does not live long enough và tài liệu tham khảo phải có giá trị cho các đời của 'a, nhưng có vẻ với tôi như nó được định nghĩa cho 'a.

Tôi cũng đã cố gắng thay đổi nó để:

let out = &mut TokenList::<'a>::new(); 

mà không thay đổi bất kỳ thông báo lỗi. Hoặc:

let out = &'a mut TokenList::<'a>::new(); 

trình biên dịch không thích gì cả.

Làm cách nào để xác định out để có tuổi thọ là 'a?

Để biết thêm chi tiết, đây là định nghĩa của tôi về TokenList:

pub type Token<'a> = &'a str; 
pub type TokenList<'a> = Vec<Token<'a>>; 
+4

Tóm lại, thời gian sống chỉ mô tả thời gian sống của một cái gì đó, không bao giờ ảnh hưởng đến thời gian sống của nó. – delnan

+0

Quá tệ. Đó sẽ là một tính năng tuyệt vời. Cảm ơn! – wmaxlees

Trả lời

11

Thời gian tồn tại của out không phải là 'a, vì out bị phá hủy vào cuối của hàm. Rust sẽ không cho phép bạn trả về một tham chiếu đến nó (nó sẽ cho phép truy cập bộ nhớ giải phóng!).

Hãy thử thay đổi chức năng của bạn như sau:

fn take_symbol<'a>(ch: &'a str, current: &'a mut String) -> TokenList<'a> { 
    let out = TokenList::<'a>::new(); 

    out.push(current.as_str()); 
    out.push(ch); 

    *current = String::new(); 

    out 
} 

Bằng cách này bạn sẽ vượt qua quyền sở hữu của out cho người gọi và nó sẽ sống đủ lâu.

+0

Ahhh, tôi cảm thấy câm. Vì lý do nào đó, tôi đã nghĩ đến '& str' như một chuỗi và một trình bao bọc mặc dù' & 'chỉ rõ nó là một tham chiếu. Bây giờ tôi đã thực hiện sửa chữa của bạn, nó là khá rõ ràng tôi cần phải quay trở lại và xác định lại datatype ban đầu của tôi và tuyên truyền rằng thay đổi thông qua mã của tôi. Cảm ơn bạn! – wmaxlees

+0

Không sao cả! Tôi đoán cảm giác câm là một tác dụng rõ ràng của việc học: P ... đặc biệt là khi học Rust! – aochagavia