我有以下的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]>>,但這樣做總是不斷地出現相同的錯誤。
uj5u.com熱心網友回復:
我按照編譯器的錯誤資訊,產生了這個可以編譯的通用代碼。我對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。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/318599.html
標籤:
上一篇:Chrome擴展::嘗試將chrome.runtime.sendmessage的語法理解為chrome.runtime.onMessage
下一篇:使用泛型來獲得正確的回傳型別
