gpt4 book ai didi

rust - 如何创建在应用的操作中通用的 Rust 函数?

转载 作者:行者123 更新时间:2023-11-29 08:22:52 28 4
gpt4 key购买 nike

我有一个名为 new_vec 的函数。它需要两个向量并通过对压缩向量中的元素对执行元素运算来创建一个新向量。

fn main() {
let v1s = vec![1, 0, 1];
let v2s = vec![0, 1, 1];
let v3s = new_vec(v1s, v2s);
println!("{:?}", v3s) // [1, 1, 2]
}

fn new_vec(v1s: Vec<i32>, v2s: Vec<i32>) -> Vec<i32> {
let mut v3s = Vec::<i32>::new();
for (v1, v2) in v1s.iter().zip(v2s.iter()) {
v3s.push(v1 + v2) // would also like to use -
}
v3s
}

我想要一个 new_vec 函数,用于可以对两个整数使用的常见二元运算,例如 +- , /, *.

我该怎么做?我可以想象两种方式:宏和闭包。如何以最佳方式执行此操作的最小示例,例如使用 +- 将不胜感激。

最佳答案

我会传递一个闭包:

fn new_vec<F>(v1s: &[i32], v2s: &[i32], foo: F) -> Vec<i32>
where F: Fn(i32, i32) -> i32
{
let mut v3s = Vec::<i32>::new();
for (&v1, &v2) in v1s.iter().zip(v2s.iter()) {
v3s.push(foo(v1, v2))
}
v3s
}

fn main() {
let v1s = vec![1, 0, 1];
let v2s = vec![0, 1, 1];
let v3s = new_vec(&v1s, &v2s, |x, y| x - y);
let v4s = new_vec(&v1s, &v2s, |x, y| x + y);
println!("{:?}", v3s); // [1, -1, 0]
println!("{:?}", v4s); // [1, 1, 2]
}

注意前两个参数的变化;如果你的函数不需要使用它的参数,references are preferable to Vectors - 在本例中为 &[i32]

这个实现不是很有效,因为生成的 Vector 是增量扩展的;最好按如下方式修改以减少分配次数:

fn new_vec<F>(v1s: &[i32], v2s: &[i32], foo: F) -> Vec<i32>
where F: Fn(i32, i32) -> i32
{
v1s.iter().zip(v2s.iter()).map(|(&x, &y)| foo(x, y)).collect()
}

关于rust - 如何创建在应用的操作中通用的 Rust 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40241407/

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