rust - 使用适用于 Vec 和数组 [] 的特征编写 rust 函数
问题描述
我想在 rust 中实现一个函数,计算数组或 Vec 的范数
对于 Vec<f64> 我会将函数编写为
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()
}
但是有没有办法通过使用特征将两个版本组合成一个函数。我在想类似的东西
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));
}
推荐阅读
- python - 直接在函数中更改对象是python中的反模式吗?
- python-3.x - 如何从 python 脚本调用 API 的 curl 命令
- php - php中的css包含页面到主页
- python - 如何创建 numpy.ndarray 的子类?
- python - 两个类别的 Matplotlib 散点图图例,(带字典?)
- javascript - 如何使用 Javascript 在 iPhone 上自动播放音频?
- java - 如何将多个组件添加到具有不同大小的垂直可滚动面板
- matlab - 如何实现 Neumann 级数迭代以逼近 Ax = b?
- facebook - 登录失败:您无法使用 Facebook 登录此应用或网站,因为它的 Facebook 登录实现存在问题
- javascript - 在同一页面上为两个单独的画廊使用灯箱画廊代码?