我有一个结构体,其中实现了几个运算符:
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运算符,如果找到,则自动获取两个参数的不可变引用?
不,添加两个值时无法自动获取引用。
\n我想你可以编写自己的宏来执行此操作。在使用中,它看起来像:
\nthing!{ a + b }\n// expands to\n(&a + &b)\nRun Code Online (Sandbox Code Playgroud)\n我预计这个宏很快就会变得写起来令人厌烦。
\n也可以看看:
\n| 归档时间: |
|
| 查看次数: |
333 次 |
| 最近记录: |