Rust 可以自动获取值的不可变引用吗?

Pet*_*roz 2 rust

我有一个结构体,其中实现了几个运算符:

use std::ops;

/// Vector of 3 floats
#[derive(Debug, Copy, Clone)]
pub struct Vec3 {
    pub x: f32,
    pub y: f32,
    pub z: f32,
}

/// Add operator
impl ops::Add<&Vec3> for &Vec3 {
    type Output = Vec3;

    #[inline(always)]
    fn add(self, rhs: &Vec3) -> Self::Output {
        Vec3 {
            x: self.x + rhs.x,
            y: self.y + rhs.y,
            z: self.z + rhs.z,
        }
    }
}

/// Subtract operator
impl ops::Sub<&Vec3> for &Vec3 {
    type Output = Vec3;

    #[inline(always)]
    fn sub(self, rhs: &Vec3) -> Self::Output {
        Vec3 {
            x: self.x - rhs.x,
            y: self.y - rhs.y,
            z: self.z - rhs.z,
        }
    }
}

/// Scalar multiplication operator
impl ops::Mul<&Vec3> for f32 {
    type Output = Vec3;

    #[inline(always)]
    fn mul(self, rhs: &Vec3) -> Self::Output {
        Vec3 {
            x: self * rhs.x,
            y: self * rhs.y,
            z: self * rhs.z,
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我想使用运算符:

let a = Vec3 { x: 0.0, y: 0.5, z: 1.0 };
let b = Vec3 { x: 1.0, y: 0.5, z: 0.0 };
let c = Vec3 { x: 1.0, y: 1.0, z: 0.0 };
let d = Vec3 { x: 0.0, y: 1.0, z: 1.0 };
let result = 2.0 * (a + b) - 3.0 * (c - d);
Run Code Online (Sandbox Code Playgroud)

此代码将无法编译,因为运算符是为 实现的&Vec3,而不是为 实现的Vec3。要解决此问题,最后一行必须如下所示:

let result = &(2.0 * &(&a + &b)) - &(3.0 * &(&c - &d));
Run Code Online (Sandbox Code Playgroud)

这看起来不再那么好看了。

我知道我可以实现运算符来Vec3避免这个问题,但是如果我仍然想在堆栈上使用对这些向量的不可变引用怎么办?也许有一种方法可以给 Rust 一些提示,如果我编写a + b并且没有运算符 for Vec3 + Vec3,它可以尝试查找&Vec3 + &Vec3运算符,如果找到,则自动获取两个参数的不可变引用?