2016-03-16 12 views
11

Tôi đang làm việc thông qua các ví dụ trong Rust by Example.Tại sao việc biên dịch không thành công khi một thành viên của một giá trị di chuyển được gán cho?

fn main() { 
    let mut point: Point = Point { x: 0.3, y: 0.4 }; 
    println!("point coordinates: ({}, {})", point.x, point.y); 

    let rectangle = Rectangle { 
     p1: Point { x: 1.0, y: 1.0 }, 
     p2: point, 
    }; 

    point.x = 0.5;  // Why does the compiler not break here? 
    println!(" x is {}", point.x); // breaks here 

    println!("rectangle is {:?} ", rectangle); 
} 

tôi nhận được lỗi này (Rust 1.7):

sử dụng các giá trị chuyển: point.x
println ("x là {}", point.x);!

Bây giờ tôi hiểu rằng tôi đã point đến đối tượng Rectangle và đó là lý do tại sao tôi không còn có thể truy cập vào nó, nhưng tại sao biên soạn thất bại trên println! và không phải là nhiệm vụ trên dòng trước?

+2

[A sinh sản nhỏ hơn] (http://is.gd/j8aovB). – Shepmaster

+1

Tôi đoán "sử dụng giá trị được chuyển" có thể được hiểu là điểm mà tại đó bạn thử và đọc giá trị của nó. Việc gán cho nó không thực sự thay đổi sự bảo đảm của Rust theo nghĩa "kỹ thuật", chỉ khi bạn thử và tiêu thụ một giá trị được di chuyển. Điều đó nói rằng, tôi không hiểu hầu hết điều này cũng đủ cho bản thân mình vì vậy tôi muốn nghe từ những người có nhiều hơn thế này. –

+0

Cảm thấy giống như lỗi compiller. Điều thú vị hơn là 'let p2 = point; point.x = 0.5; println! ("X là {}", p2.x); 'biên dịch tốt và in 0,3, vì vậy' point.x = 0.5; 'không nothng – qthree

Trả lời

6

Điều gì thực sự xảy ra

fn main() { 
    let mut point: Point = Point { x: 0.3, y: 0.4 }; 
    println!("point coordinates: ({}, {})", point.x, point.y); 

    drop(point); 

    { 
     let mut point: Point; 
     point.x = 0.5; 
    } 

    println!(" x is {}", point.x); 
} 

Nó chỉ ra rằng nó nổi tiếng phát hành.

https://github.com/rust-lang/rust/issues/21232

+0

Tại sao bạn lại có một 'điểm ngắt' khác trong khối lồng nhau? Điều đó không làm thay đổi vấn đề bởi vì điểm bạn đang chỉ định là một điểm mới, ở một vị trí khác trong bộ nhớ từ bộ nhớ đã bị xóa? –

+1

@AlexKnauth Tôi nghĩ rằng ý tưởng là chỉ ra những gì đang xảy ra khi trình biên dịch nhìn thấy nó. Đó là, trình biên dịch thấy rằng phạm vi bổ sung ở đó với "điểm" riêng của nó cho phép gán. –

+0

Bởi vì 'điểm.x = 0.5;' trong mã ban đầu không làm gì với giá trị được di chuyển, nhưng cố gắng khởi tạo giá trị mới. – qthree

3

Vấn đề là trình biên dịch cho phép Reinitialization một phần của một cấu trúc, nhưng toàn bộ struct là không sử dụng được sau đó. Điều này xảy ra ngay cả khi cấu trúc chỉ chứa một trường duy nhất và ngay cả khi bạn chỉ cố gắng đọc trường mà bạn vừa mới khởi tạo lại.

struct Test { f: u32, } 

fn main() { 
    let mut t = Test { f: 0, }; 
    let t1 = t; 
    t.f = 1; 
    println!("{}", t.f); 
} 

này được thảo luận trong https://github.com/rust-lang/rust/issues/21232

+0

Tôi không rõ ràng về câu trả lời này cung cấp gì ngoài [câu trả lời hiện có] (http://stackoverflow.com/a/36051503/155423) – Shepmaster

+1

@Shepmaster Nó loại bỏ phần sai. Là một phần thưởng tôi đã thêm một lời giải thích ngắn gọn về vấn đề này, vì chỉ cần đăng một liên kết là hình thức xấu. – starblue

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