Как оператор может быть перегружен для разных типов RHS и возвращаемых значений?

Учитывая следующую структуру:

struct Vector3D {
    x: f32,
    y: f32,
    z: f32
}

Я хочу перегрузить его* оператор, чтобы сделать скалярное произведение, когда правая часть являетсяVector3Dи для поэлементного умножения, когда RHS являетсяf32, Мой код выглядит так:

// 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
    }   
}

Компилятор говорит для первого блока impl:

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 { 
...

и наоборот для другой реализации.

Ответы на вопрос(2)

Ваш ответ на вопрос