Nạp chồng toán tử (Operator Overloading)
Ta có thể thực hiện overloading toán tử thông qua các trait trong std::ops:
#[derive(Debug, Copy, Clone)]
struct Point {
x: i32,
y: i32,
}
impl std::ops::Add for Point {
type Output = Self;
fn add(self, other: Self) -> Self {
Self { x: self.x + other.x, y: self.y + other.y }
}
}
fn main() {
let p1 = Point { x: 10, y: 20 };
let p2 = Point { x: 100, y: 200 };
println!("{:?} + {:?} = {:?}", p1, p2, p1 + p2);
}
This slide should take about 10 minutes.
Một số điểm cần thảo luận:
- Ta có thể implement
Addcho&Point. Việc này có ích trong những tình huống nào?- Trả lời:
Add:addtiêu thụself. Nếu kiểuTmà ta muốn overloading toán tử không implementCopy, ta cũng nên cân nhắc overload toán tử cho&T. Như vậy ta có thể tránh việc clone không cần thiết tại thời điểm gọi hàm.
- Trả lời:
- Tại sao
Outputlà một associated type? Có thể thay thếOutputbằng một tham số generic cho hàm không?- Trả lời: Tham số generic của hàm được quyết định bởi người gọi hàm, nhưng associated types (như
Output) được quyết định bởi người implement trait.
- Trả lời: Tham số generic của hàm được quyết định bởi người gọi hàm, nhưng associated types (như
- Ta có thể implement
Addcho hai kiểu dữ liệu khác nhau, ví dụimpl Add<(i32, i32)> for Pointsẽ cộng một tuple vào mộtPoint.