generics - 如何实现泛型类型的特征?
问题描述
在 Rust 中,为泛型类型实现特征的正确方法是什么?我希望我的向量由整数或浮点数组成。无论我希望 get_magnitude() 输出 f64 的类型如何。如何让 powi() 和 sqrt() 工作?任何解决方法?我被困住了
pub struct Vector<T> {
i: T,
j: T,
k: T,
}
impl<T> Vector<T> {
fn new(i: T, j: T, k: T) -> Vector<T> {
Vector {
i,
j,
k,
}
}
}
impl<T> Vector<T> {
fn get_magnitude(&self) -> f64 {
(self.i.powi(2) + self.j.powi(2) + self.k.powi(2)).sqrt()
}
}
[https://www.codewars.com/kata/58ee4962dc4f81d6f400001c/rust][1]
解决方案
您可以get_magnitide()
限制只在T
适用时工作。而不是约束T
具有powi()
,我建议将它们转换为f64
最初并从那里进行数学计算。
您可以使用numAsPrimitive<f64>
crate 中的特征:
use num::cast::AsPrimitive; // 0.4.0
pub struct Vector<T> {
i: T,
j: T,
k: T,
}
impl<T> Vector<T> {
fn new(i: T, j: T, k: T) -> Vector<T> {
Vector { i, j, k }
}
}
impl<T> Vector<T> {
fn get_magnitude(&self) -> f64
where
T: AsPrimitive<f64>,
{
(self.i.as_().powi(2) + self.j.as_().powi(2) + self.k.as_().powi(2)).sqrt()
}
}
您还可以通过特征将整个Vector
结构限制为仅在T
是数字时才起作用Num
:
use num::Num; // 0.4.0
pub struct Vector<T>
where
T: Num
{
i: T,
j: T,
k: T,
}
但是你仍然需要约束,get_magnitude()
因为你强制它返回一个f64
.
推荐阅读
- google-apps-script - 谷歌脚本:测试谷歌表格行中是否已经存在值
- c++ - 是否可以推迟重载解决方案?
- integration - Labview 弹出请求文件夹/文件
- devexpress-mvc - Devexpress 单选按钮列表项更改颜色
- r - 将 cor.test 的结果重新格式化为数据框
- amazon-web-services - AWS Cognito 池触发器
- elasticsearch - Elasticsearch 查询消耗 100% 的 CPU
- logstash - 将字符串转换为十进制值 Logstash 变异
- html - 引导导航栏切换按钮不显示内容
- sql-server - 从多列中的多行返回结果 SQL Server