编译以下使用运算符重载的 Rust 代码:
这里解释了它的原理,可以点此链接。这导致了一个 RFC 的提出,但由于上述示例的原因,该提案并未被接受。然而,后来的 RFC 仍引入了按值传递类型签名来实现操作符。
尽管我理解做出这个决定的原理,但由于我对 Rust 缺乏经验,我不确定允许上述代码工作的“正确”方法是(a)如果我不想复制代码或(b)如何使结构体可复制?
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;
}
由于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;
^
这里解释了它的原理,可以点此链接。这导致了一个 RFC 的提出,但由于上述示例的原因,该提案并未被接受。然而,后来的 RFC 仍引入了按值传递类型签名来实现操作符。
尽管我理解做出这个决定的原理,但由于我对 Rust 缺乏经验,我不确定允许上述代码工作的“正确”方法是(a)如果我不想复制代码或(b)如何使结构体可复制?
let pp = &p + &p + &p
不起作用。 - SirVerlet pp = &(&p + &p) + &p
的东西。我猜实际操作中最好的方法是创建几个实现,就像 Vladimir Matveev 建议的那样(或者只需派生Copy
就可以了)。 - Michał Politowski