gpt4 book ai didi

rust - 编写具有适用于 Vec 和数组 [] 的特征的 Rust 函数

转载 作者:行者123 更新时间:2023-12-05 09:03:34 27 4
gpt4 key购买 nike

我想用 Rust 实现一个函数,计算数组或 Vec 的范数

对于 Vec 我会把函数写成

pub fn vector_norm( vec_a : &Vec<f64> ) -> f64 { 

let mut norm = 0 as f64;
for i in 0..vec_a.len(){
norm += vec_a[i] * vec_a[i];
}
norm.sqrt()
}

对于 &[f64] 我会做

    pub fn vector_norm( vec_a : &[f64] ) -> f64 { 

let mut norm = 0 as f64;
for i in 0..vec_a.len(){
norm += vec_a[i] * vec_a[i];
}
norm.sqrt()
}

但是有没有办法通过使用 traits 将两个版本组合成一个函数。我在想类似的事情

pub fn vector_norm<T:std::iter::ExactSizeIterator> 
( vec_a : &T ) -> f64 {

let mut norm = 0 as f64;
for i in 0..vec_a.len(){
norm += vec_a[i] * vec_a[i];
}
norm.sqrt()

这不起作用,因为模板参数 T 不可索引。有可能以某种方式做到这一点吗?也许带有迭代器特征或其他东西?

最佳答案

首先,Vec<T>工具 Deref 对于 [T] .这意味着 &Vec<f64>可以隐式转换为 &[f64] .所以,只接受 &[f64]将工作:

fn vector_norm(vec_a: &[f64]) -> f64 {
let mut norm = 0 as f64;
for i in 0..vec_a.len() {
norm += vec_a[i] * vec_a[i];
}
norm.sqrt()
}

fn main() {
let my_vec = vec![1.0, 2.0, 3.0];
// &my_vec is implicitly converted to &[f64]
println!("{:?}", vector_norm(&my_vec));
}

但是,如果您想将可接受的值进一步扩大到所有类似切片的类型,也许 AsRef 可能有用:

fn vector_norm<T: AsRef<[f64]>>(vec_a: T) -> f64 {
// use AsRef to get a &[f64]
let vec_a: &[f64] = vec_a.as_ref();
let mut norm = 0 as f64;
for i in 0..vec_a.len() {
norm += vec_a[i] * vec_a[i];
}
norm.sqrt()
}

fn main() {
let my_vec = vec![1.0, 2.0, 3.0];
println!("{:?}", vector_norm(&my_vec));
}

关于rust - 编写具有适用于 Vec 和数组 [] 的特征的 Rust 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69858361/

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