Biên dịch mã Rust sau đó sử dụng toán tử quá tảiđiều hành quá tải bởi kết quả giá trị sử dụng của giá trị chuyển
use std::ops::{Add};
#[derive(Show)]
struct Point {
x: int,
y: int
}
impl Add for Point {
type Output = Point;
fn add(self, other: Point) -> Point {
Point {x: self.x + other.x, y: self.y + other.y}
}
}
fn main() {
let p: Point = Point {x: 1, y: 0};
let pp = p + p;
}
Kết quả trong các lỗi biên dịch do quyền sở hữu của p:
<anon>:21:18: 21:19 error: use of moved value: `p`
<anon>:21 let pp = p + p;
^
<anon>:21:14: 21:15 note: `p` moved here because it has type `Point`, which is non-copyable
<anon>:21 let pp = p + p;
^
Lý do đằng sau nó được giải thích here và dẫn đến một số RFC không được chấp nhận (một phần do lý do của ví dụ trên). Tuy nhiên, sau RFC vẫn giới thiệu chữ ký loại giá trị cho các toán tử.
Mặc dù tôi hiểu lý do đằng sau quyết định. Do sự thiếu kinh nghiệm của tôi trong rỉ sét, tôi không chắc chắn cách "thích hợp" sẽ cho phép mã trên làm việc (a) nếu tôi không muốn sao chép hoặc (b) làm sao để cấu trúc có thể sao chép được?
Vấn đề với điều này là 'let pp = & p + & p + & p' không hoạt động. – SirVer
@SirVer có, bạn sẽ phải viết một cái gì đó như 'let pp = & (& p + & p) + & p'. Tôi đoán rằng điều thực tế cần làm là tạo ra một số triển khai, giống như câu trả lời của Vladimir Matveev gợi ý (hoặc chỉ bắt nguồn từ 'Sao chép' và được thực hiện với nó). –