generics - 在 Array1 上创建一个泛型方法
问题描述
我有以下 Trait 实现,并希望unit
通用 over Array1<T>
,但未能找到正确的 Trait 边界(尤其是这对我来说似乎微不足道,所有 T 需要支持的基本上是输出 T 以使函数工作的基本算术) .
trait Unit {
fn unit(&self) -> Array1<f32>;
}
impl Unit for Array1<f32>
{
fn unit(&self) -> Array1<f32> {
self / (self * self).sum().sqrt()
}
}
编译器建议添加std::ops::Mul<Output = &ArrayBase<OwnedRepr<T>, Dim<[usize; 1]>>>
,但这样做会一遍又一遍地给出相同的错误。
解决方案
我遵循编译器错误消息并生成了这个可编译的通用代码。我不熟悉,ndarray
所以我不知道这是否真的正确。
use std::ops::Mul;
use num_traits::{Zero, real::Real};
use ndarray::prelude::*;
trait Unit {
type Output;
fn unit(&self) -> Array1<Self::Output>;
}
impl<T> Unit for Array1<T>
where
for<'a> &'a Array1<T>: Mul<Output = Array1<T>>,
T: Real + Clone + Zero + ndarray::ScalarOperand,
{
type Output = T;
fn unit(&self) -> Array1<T> {
self / (self * self).sum().sqrt()
}
}
请注意,Unit
现在返回关联类型。如果您希望它始终返回f32
,那么您也需要要求它T
也可以转换为f32
。
推荐阅读
- powershell - Powershell 总是以“管理员身份”打开
- arrays - 可变数组/列表内存大小
- javascript - 为什么不能从端口 3000 监听端口 80 ?(Nginx)
- dbcontext - EF Core、DbContext 包含相关实体
- mongodb - 我应该如何将完整的 .lic 或 .licx 文件插入到 mongodb 集合中?
- python - 运行 python 脚本时计算 GPU 能量
- javascript - 带按钮的多行图像滑块
- plc - 通过引用传递的输入变量的语义是什么?
- excel - Excel VBA:是否有可用于日期的动态数组?
- css - 如何将 CSS 动画导出为动画 PNG、gif 或 WEBP *具有透明度*?