在 Array1<T> 上创建一个通用方法
Making a method generic over Array1<T>
我有以下 Trait 实现,并希望 unit
通用于 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
现在 return 是一个关联类型。如果您希望它始终 return f32
那么您需要要求 T
也可以转换为 f32
。
我有以下 Trait 实现,并希望 unit
通用于 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
现在 return 是一个关联类型。如果您希望它始终 return f32
那么您需要要求 T
也可以转换为 f32
。