< 返回版块

17863963452 发表于 2021-02-09 20:18

Tags:泛型mean函数编写

fn mean<T>(array:&Vec<T>)->T
    where T:Default+Copy+std::ops::AddAssign
{
    let mut result:T=Default::default();
    for i in array{
        result+=*i;
    }
    result/array.len()
}
最后返回值变为一个泛型与usize的除法,这里我不知道怎么解决,大家有什么解决方案吗?

评论区

写评论
作者 17863963452 2021-02-09 21:24

谢谢各位大佬的解答

Bai-Jinlin 2021-02-09 21:19

f64没实现对usize的除法,而且usize本身也into不到任何基本的数字和浮点数类型,你要实在想这么搞可以不过估计没有完美的解决方案

--
👇
17863963452: ```rust let array:Vec=vec![1.0,2.0,3.0,4.0]; println!("{}",mean(&array)); 谢谢大佬,请问调用这个函数说no implementation for f64 / usize怎么解决?

作者 17863963452 2021-02-09 20:52

谢谢 let a=[1,2,3]; 也可以,不知道为什么形参需要数组的引用,实参用vector的引用也可以

--
👇
Bai-Jinlin: 你这个例子不建议参数用Vec,直接[T]就好了。

fn mean<T>(array:&[T])->T
    where T:Default+Copy+std::ops::AddAssign+std::ops::Div<usize,Output=T>
{
    let mut result:T=Default::default();
    for i in array{
        result+=*i;
    }
    result/array.len()
}
fn main(){
    let a=vec![1,2,3];
    println!("{}",mean(&a));
}
作者 17863963452 2021-02-09 20:44
let array:Vec<f64>=vec![1.0,2.0,3.0,4.0];
println!("{}",mean(&array));
谢谢大佬,请问调用这个函数说no implementation for `f64 / usize`怎么解决?
Bai-Jinlin 2021-02-09 20:43

你这个例子不建议参数用Vec,直接[T]就好了。

fn mean<T>(array:&[T])->T
    where T:Default+Copy+std::ops::AddAssign+std::ops::Div<usize,Output=T>
{
    let mut result:T=Default::default();
    for i in array{
        result+=*i;
    }
    result/array.len()
}
fn main(){
    let a=vec![1,2,3];
    println!("{}",mean(&a));
}
IWANABETHATGUY 2021-02-09 20:38

你的返回结果T 用到了 /,所以需要实现 trait Div

#[doc(alias = "/")]
pub trait Div<Rhs = Self> {
    /// The resulting type after applying the `/` operator.
    #[stable(feature = "rust1", since = "1.0.0")]
    type Output;

    /// Performs the `/` operation.
    ///
    /// # Example
    ///
    /// ```
    /// assert_eq!(12 / 2, 6);
    /// ```
    #[must_use]
    #[stable(feature = "rust1", since = "1.0.0")]
    fn div(self, rhs: Rhs) -> Self::Output;
}

而你的返回结果需要的是 T / usize -> usize, 所以你需要加一个限定 Div<usize, Output = T>

IWANABETHATGUY 2021-02-09 20:34
fn mean<T>(array: &Vec<T>) -> T
where
    T: Default + Copy + std::ops::AddAssign + std::ops::Div<usize, Output = T>
{
    let mut result: T = Default::default();
    for i in array {
        result += *i;
    }
    result / array.len()
}
1 共 7 条评论, 1 页