gpt4 book ai didi

rust - 如何允许函数使用整数或 float ?

转载 作者:行者123 更新时间:2023-11-29 07:49:29 25 4
gpt4 key购买 nike

found a function to compute a mean并且一直在玩它。下面的代码片段运行,但如果输入中的数据从 float 更改为 int,则会发生错误。我如何让它与 float 和整数一起使用?

use std::borrow::Borrow;

fn mean(arr: &mut [f64]) -> f64 {
let mut i = 0.0;
let mut mean = 0.0;
for num in arr {
i += 1.0;
mean += (num.borrow() - mean) / i;
}
mean
}

fn main() {
let val = mean(&mut vec![4.0, 5.0, 3.0, 2.0]);
println!("The mean is {}", val);
}

最佳答案

问题中的代码无法编译,因为 f64没有 borrow()方法。此外,它接受的切片不需要是可变的,因为我们没有改变它。这是编译和工作的修改版本:

fn mean(arr: &[f64]) -> f64 {
let mut i = 0.0;
let mut mean = 0.0;
for &num in arr {
i += 1.0;
mean += (num - mean) / i;
}
mean
}

我们指定 &num当遍历 arr 时, 这样 num 的类型是f64而不是对 f64 的引用.此代码段适用于两者,但省略它会破坏通用版本。

对于同样接受 float 和整数的相同函数,其参数需要通用。理想情况下,我们希望它接受任何可以转换为 f64 的类型。 , 包括 f32或定义此类转换的用户定义类型。像这样:

fn mean<T>(arr: &[T]) -> f64 {
let mut i = 0.0;
let mut mean = 0.0;
for &num in arr {
i += 1.0;
mean += (num as f64 - mean) / i;
}
mean
}

这不会编译,因为 x as f64没有为 x 定义任意类型的。相反,我们需要一个绑定(bind)在 T 上的特征定义了一种转换 T 的方法值为 f64 .这正是 Into trait 的目的。 ;每种类型 T实现 Into<U>定义一个 into(self) -> U方法。指定 T: Into<f64>因为特征界限给了我们 into()返回 f64 的方法.

我们还需要请求T成为Copy ,以防止从数组中读取值以“消耗”该值,即尝试将其移出数组。由于整数等原始数字实现了 Copy ,这对我们来说没问题。工作代码如下所示:

fn mean<T: Into<f64> + Copy>(arr: &[T]) -> f64 {
let mut i = 0.0;
let mut mean = 0.0;
for &num in arr {
i += 1.0;
mean += (num.into() - mean) / i;
}
mean
}

fn main() {
let val1 = mean(&vec![4.0, 5.0, 3.0, 2.0]);
let val2 = mean(&vec![4, 5, 3, 2]);
println!("The means are {} and {}", val1, val2);
}

请注意,这仅适用于定义无损 转换为 f64 的类型.因此它将适用于 u32 , i32 (如上例所示)和更小的整数类型,但它不会接受例如 i64 的向量或 u64 , 无法无损转换为 f64 .

另请注意,此问题非常适合函数式编程习语,例如 enumerate() fold() .虽然超出了这个已经很长的答案的范围,但写出这样的实现是一个练习 hard to resist .

关于rust - 如何允许函数使用整数或 float ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42896665/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com