zod*_*iac 2 traits rust iterator-traits
我想在 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()
}
Run Code Online (Sandbox Code Playgroud)
对于 &[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()
}
Run Code Online (Sandbox Code Playgroud)
但是有没有办法通过使用特征将两个版本组合成一个函数。我在想类似的事情
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()
Run Code Online (Sandbox Code Playgroud)
}
这不起作用,因为模板参数 T 不可索引。有可能以某种方式做到这一点吗?也许具有迭代器特征或其他什么?
首先,Vec<T>实现Deref. [T]这意味着&Vec<f64>可以隐式转换为&[f64]. 所以,只需要接受一个&[f64]will 就可以了:
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));
}
Run Code Online (Sandbox Code Playgroud)
但是,如果您想将可接受的值进一步扩大到所有类似切片的类型,也许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));
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
846 次 |
| 最近记录: |