generics - 均值函数的 Rust 泛型语法

标签 generics math syntax rust

我正在尝试编写一个函数,它接受一段数字并计算平均值。

我尝试使用来自 Implementing mean function for generic types 的想法但出现错误。

我的代码是:

extern crate num;

use num::{FromPrimitive, Zero};
use std::ops::{Add, Div};

fn main() {
    let mut numbers = [10, -21, 15, 20, 18, 14, 18];
    let err = "Slice is empty.";

    println!("Mean is {:.3}", mean(&numbers).expect(err));
}

fn mean<T>(numbers: &[T]) -> Option<f64>
where
    T: Copy + Zero + Add<T, Output = T> + Div<T, Output = T> + FromPrimitive,
{
    match numbers.len() {
        0 => None,
        _ => {
            let sum = numbers.iter().sum: ();
            let length = FromPrimitive::from_usize(numbers.len()).unwrap();
            Some(sum / length)
        }
    }
}

错误是:

error[E0658]: type ascription is experimental (see issue #23416)
  --> src/main.rs:20:23
   |
20 |             let sum = numbers.iter().sum: ();
   |                       ^^^^^^^^^^^^^^^^^^^^^^

有没有什么方法可以在不使用实验性特征的情况下编写通用均值函数?

最佳答案

您在通用函数中执行了 2 个不同的操作:

  • 对 slice 中的所有值求和:您需要通过添加 Sum<T> 来表明您的元素是可求和的泛型类型参数的边界。
  • 2 个元素的除法运算: 您的泛型需要转换为 f64或您要限制的任何浮点类型。由于您使用的是 num crate,我添加了 ToPrimitive作为边界,它告诉您可以将泛型类型转换为原始类型。

这里是实现:

fn mean<'a, T: 'a>(numbers: &'a [T]) -> Option<f64>
where
    T: ToPrimitive + Sum<&'a T>,
{
    match numbers.len() {
        0 => None,
        _ => {
            let sum = numbers.iter().sum::<T>();
            let length = f64::from_usize(numbers.len())?;

            T::to_f64(&sum).map(|sum| sum / length)
        }
    }
}

Playground

关于generics - 均值函数的 Rust 泛型语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54168352/

相关文章:

Java 泛型集合

java - 尝试制作图形计算器,在线程 "AWT-EventQueue-0"java.lang.StackOverflowError 中收到异常

c# - 如何在 C# 中为委托(delegate)类型的参数提供默认值?

c++ - (C++,Qt,Linux) 将游戏 map 坐标转换为图像坐标

css - 在使用 CSS 变换倾斜后应用于位置 div 的边距

flutter - @ ('at sign' ) 符号在 dart 中意味着什么?

java - 在Java中使用 'enhanced for'迭代时修改数组元素是否有效?

c# - 检查 T 对象是否具有属性并设置属性

c# - 在 C# 中,Type.FullName 何时返回 null?

c# - 是否有索引器返回的具有协变类型参数的内置通用接口(interface)?