Tôi có khó khăn tìm hiểu lý do tại sao mã này không biên dịch:vấn đề Lifetime với Send đặc điểm
use std::cell::{Ref, RefCell};
struct St {
data: RefCell<uint>
}
impl St {
pub fn test(&self) -> Ref<uint> {
self.data.borrow()
}
}
// This code would compile without T constrained to be Send.
fn func<T: Send>(_: &T) {
}
fn main() {
let s = St { data: RefCell::new(42) };
{
let r7 = s.test();
// Do not compile
func(&r7)
}
// Compile
func(&s);
}
Nó cung cấp cho các lỗi sau:
bug.rs:21:18: 21:19 error: `s` does not live long enough
bug.rs:21 let r7 = s.test();
^
note: reference must be valid for the static lifetime...
bug.rs:17:11: 28:2 note: ...but borrowed value is only valid for the block at 17:10
bug.rs:17 fn main() {
bug.rs:18 let s = St { data: RefCell::new(42) };
bug.rs:19
bug.rs:20 {
bug.rs:21 let r7 = s.test();
bug.rs:22 // Do not compile
...
Vấn đề này có vẻ là trong hàm func()
khi tôi cố gắng hạn chế T
để tương thích với đặc điểm Send
. Không có ràng buộc này, mã này biên dịch mà không có lỗi.
Có ai có thể giải thích cho tôi lý do của hành vi này là gì không?
Cảm ơn câu trả lời tuyệt vời, tôi hiểu ngay bây giờ! – user3762625