die folgende Struktur gegeben:Wie kann ein Bediener für verschiedene RHS-Typen und Rückgabewerte überlastet werden?
struct Vector3D {
x: f32,
y: f32,
z: f32
}
Ich möchte seine *
Betreiber zu überlasten ein Punktprodukt zu tun, wenn die rechte Seite ein Vector3D
ist, und ein Element weise Multiplikation zu tun, wenn die rechte Seite ein f32
ist. Mein Code sieht wie folgt aus:
// Multiplication with scalar
impl Mul<f32, Vector3D> for Vector3D {
fn mul(&self, f: &f32) -> Vector3D {
Vector3D {x: self.x * *f, y: self.y * *f, z: self.z * *f}
}
}
// Multiplication with vector, aka dot product
impl Mul<Vector3D, f32> for Vector3D {
fn mul(&self, other: &Vector3D) -> f32 {
self.x * other.x + self.y * other.y + self.z * other.z
}
}
Der Compiler sagt zum ersten impl Block:
Vector3D.rs:40:1: 44:2 error: conflicting implementations for trait `std::ops::Mul`
Vector3D.rs:40 impl Mul<f32, Vector3D> for Vector3D {
...
Vector3D.rs:53:1: 57:2 note: note conflicting implementation here
Vector3D.rs:53 impl Mul<Vector3D, f32> for Vector3D {
...
und umgekehrt für die andere Implementierung.
Dies ist ein Duplikat von http://stackoverflow.com/questions/24554738/rust-resolving-trait-impl-conflicts. –
@ChrisMorgan ist es nicht wirklich ein Duplikat. Diese Frage hat zwei konkrete "Impls", während diese Frage einen generischen "impl" zusammen mit einem konkreten "impl" hat. – huon