Rust 中的 const 除以泛型

2023-11-26

我有一个结构Vec3<T>,我该如何实现以下方法?

impl<T: num::Num + num::Float> Not<Vec3<T>> for Vec3<T> {
    fn not(&self) -> Vec3<T> {
        *self * (1.0 / (*self % *self).sqrt())
    }
}

错误:类型不匹配:预期_, found T(预期的浮点变量,找到的类型参数)

Type of 1.0 is _而类型为(*self % *self).sqrt() is T。而且似乎不能将 _ 除以 T。

我尝试了 1.0 的各种铸造:

*self * ((1.0 as T) / (*self % *self).sqrt())

错误:非标量转换:_ as T

*self * (1.0.div((*self % *self).sqrt()))

错误:类型不匹配:预期&_, found T(预期的 &-ptr,找到的类型参数)

实现此方法的最简单方法是什么?

Edit 1:根据要求,这是我的完整代码:

use std::num::Float;

pub struct Vec3<T> {
    pub x: T,
    pub y: T,
    pub z: T,
}

impl<T> Vec3<T> {
    pub fn new(x: T, y: T, z: T) -> Vec3<T> {
        Vec3 { x: x, y: y, z: z }
    }
}

impl<T: Float> Add<T, Vec3<T>> for Vec3<T> {
    fn add(&self, rhs: &T) -> Vec3<T> {
        Vec3 { x: self.x + *rhs, y: self.y + *rhs, z: self.z + *rhs }
    }
}

impl<T: Float> Add<Vec3<T>, Vec3<T>> for Vec3<T> {
    fn add(&self, rhs: &Vec3<T>) -> Vec3<T> {
        Vec3 { x: self.x + rhs.x, y: self.y + rhs.y, z: self.z + rhs.z }
    }
}

impl<T: Float> Mul<T, Vec3<T>> for Vec3<T> {
    fn mul(&self, rhs: &T) -> Vec3<T> {
        Vec3 { x: self.x * *rhs, y: self.y * *rhs, z: self.z * *rhs }
    }
}

// x % y : dot-product
impl<T: Float> Rem<Vec3<T>, T> for Vec3<T> {
    fn rem(&self, rhs: &Vec3<T>) -> T {
        self.x + rhs.x * self.y + rhs.y * self.z + rhs.z
    }
}

// x ^ y : cross-product
impl<T: Float> BitXor<Vec3<T>, Vec3<T>> for Vec3<T> {
    fn bitxor(&self, rhs: &Vec3<T>) -> Vec3<T> {
        Vec3 { x: self.y * rhs.z - self.z * rhs.y,
               y: self.z * rhs.x - self.x * rhs.z,
               z: self.x * rhs.y - self.y * rhs.x }
    }
}

// !x : Norm
impl Not<Vec3<f32>> for Vec3<f32> {
    fn not(&self) -> Vec3<f32> {
        *self * (1.0f32 / (*self % *self).sqrt())
    }
}

impl Not<Vec3<f64>> for Vec3<f64> {
    fn not(&self) -> Vec3<f64> {
        *self * (1.0f64 / (*self % *self).sqrt())
    }
}

我会用Num代替Float能够拥有整数向量,但由于它已被弃用,我认为更好的选择是使用宏来复制所有类型的代码。这里我复制了Not for f32 and f64


文字只能是原始类型。您无法将文字转换为某种泛型类型。

对于像这样的常数1.0你可以使用类似的方法Float::one(),所以你的具体例子可以重写为

impl<T: num::Float> Not<Vec3<T>> for Vec3<T> {
    fn not(&self) -> Vec3<T> {
        *self * (num::Float::one() / (*self % *self).sqrt())
    }
}

(请注意,我删除了Num绑定,因为它已被弃用,在这种情况下它完全被取代Float)

将任意值转换为某些特定值的实例Float您可以使用的类型NumCast::from() method:

let x: T = num::NumCast::from(3.14f64);

顺便说一句,你可能会发现这个接受的 RFC有趣的。

Update

您很可能无法实施Float对于您的结构,因为它有很多特定于裸浮点数的方法,例如尾数大小。我想你必须添加类似的方法one() and zero()并可能自己根据数字进行转换。然后你就可以写

impl<T: num::Float> Not<Vec3<T>> for Vec3<T> {
    fn not(&self) -> Vec3<T> {
        *self * (Vec3::one() / (*self % *self).sqrt())
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Rust 中的 const 除以泛型 的相关文章

随机推荐

  • R 中 data.frame 长度不同的列表列表

    我在 SO 中读到了很多关于将列表列表转换为 df 的答案 但是 我注意到它们的列表长度 在主大列表内 都是相同的 我有一个不同的案例 h1 lt list USA c 10 13 17 11 RUSSIA NULL BRAZIL NULL
  • 如何更改禁用的文本框的字体颜色?

    有谁知道哪个属性设置禁用控件的文本颜色 我必须在禁用状态下显示一些文本TextBox我想将其颜色设置为黑色 NOTE 请参阅下面 Cheetah 的答案 因为它确定了使该解决方案发挥作用的先决条件 设置BackColor of the Te
  • 在 PHP 循环中构建逗号分隔的字符串

    大家好 我需要这样做 我有一个共同的循环 foreach stuffs as stuff echo stuff 假设 stuff 是我拥有的 mysql 表的 id 并且我不想在下一个结果中显示 所以我想构建一个像这样的字符串 1 23 5
  • 有人可以解释互斥体及其使用方法吗?

    我读了一些有关互斥体的文档 但我唯一的想法是它有助于防止线程访问已被另一个资源使用的资源 我从代码片段中获取并执行 效果很好 include
  • Flutter:流已被收听[重复]

    这个问题在这里已经有答案了 我正在使用 BLoC 从 Firestore 加载预设对象 这是我的块模型 class StatisticsBloc extends BlocBase List
  • Android 中的 requestLocationUpdates 间隔

    我尝试获得 onLocationChanged 函数的正确更新速度 这是我的课程 public class LocationService extends Service implements LocationListener 将 minT
  • 用于组合学/背包的动态 T-SQL 方法

    我想我的问题与背包问题的一个变体有关 但我无法真正想出解决方案 假设您在一家五金店 需要购买 21 个螺丝 他们只提供袋装产品 袋子 X 16 个螺丝 每个螺丝 1 56 美元 总计 25 美元 Y 袋 8 个螺丝 每个螺丝 2 25 美元
  • 在 JavaScript 中增加日期

    我需要在 JavaScript 中将日期值增加一天 例如 我有一个日期值 2010 09 11 我需要将第二天的日期存储在 JavaScript 变量中 如何将日期增加一天 三种选择供您选择 1 仅使用 JavaScriptDate对象 无
  • java.lang.InknownClassChangeError:找到接口com.google.android.gms.location.SettingsClient,[关闭]

    Closed 这个问题需要调试细节 目前不接受答案 我无法在模拟器或真实设备上运行该应用程序 当我尝试从 VS Code 运行该应用程序时 它显示以下错误消息 我尝试卸载该应用程序并执行flutter clean 无需更改包我也面临这个问题
  • 很难让 browserify-shim 与 grunt-browserify (> 2.0.2) 一起使用作为转换

    在2 0 2版本中grunt browserify browserify shim已从模块本身中删除并转换为用作transform 而不是直接的option on a grunt browserify task The old使用垫片的版本
  • 运行 docker 容器的 docker 内部的气流

    我在 EC2 实例上运行气流 并且正在安排一些启动 Docker 容器的任务 我怎么做 我需要在气流容器上安装 docker 吗 以及下一步是什么 我有一个用于启动容器的 yaml 文件 它源自 puckel airflow Docker
  • iOS 12 中新 iOS 13 系统颜色的回退行为

    我目前正在采用深色模式 我认为使用新的系统颜色 例如systemBackground and label也在界面生成器中正常工作在 iOS 12 中运行该应用程序时 我本以为会出现编译器错误 但该应用程序看起来就像在 iOS 13 轻量模式
  • 从同一向量中推回一个元素是否安全?

    vector
  • 解析类似电子邮件的标头(类似于 RFC822)

    问题 问题 有一个机器人信息数据库我想解析一下 据说是类似于 RFC822 消息 在我重新发明轮子并编写自己的解析器之前 我想我应该看看是否还有其他可用的东西 我偶然发现imap rfc822 parse headers 这似乎正是我想要的
  • 在 Varnish 4 中重试期间更改后端

    我希望能够在 Varnish 4 中重试时更改后端 我们已经使用 Varnish 3 在不同的 较旧的 应用程序上进行了此操作 但我无法弄清楚 v4 的情况 也无法弄清楚找到很多文档 我们想要的设置是有 2 组控制器 一组用于初始请求 尝试
  • 类型错误:对象不支持此属性或方法

    我创建了 Rails 应用程序 在其中创建了数据库 空 当我尝试查看我的产品页面时 我收到以下错误http localhost 3000 产品页 在迁移数据库之前 应用程序可以正常运行 我正在使用 therubyracer 并且使用的是 W
  • 不同域上的 ASP.NET Core CookieAuthenticationOptions.LoginPath

    我在用着CookieAuthenticationOptions在我的 NET Core 应用程序中配置身份验证 但我的登录页面位于不同的域中 但是 那LoginPath属性只允许内部路径 而不是完整的 URI 所以下面的代码 var coo
  • VBA Windows 7 样式按钮

    我很确定这个问题在网络上被问了很多 并且我在几个论坛上阅读了很多问题及其 答案 但我从未见过明确的答案 所以我想知道 可以使用 Windows 7 风格的按钮 在 Excel VBA 中还是我必须使用这些看起来像来自的灰色东西 I dont
  • 哪些 Google GWT 产品使用 UiBinder? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 我想知道google的哪个
  • Rust 中的 const 除以泛型

    我有一个结构Vec3