gpt4 book ai didi

rust - 如何使 Rust 函数 `zip_map` 采用二元函数而不是以二元组作为参数的一元函数?

转载 作者:行者123 更新时间:2023-12-05 04:19:56 25 4
gpt4 key购买 nike

我有以下代码:

pub trait Iterx: Iterator {
fn zip_map<U, T, F>(self, other: U, f: F) -> Map<Zip<Self, U::IntoIter>, F>
where
Self: Sized,
U: IntoIterator,
F: Fn((<Self as Iterator>::Item, <U as IntoIterator>::Item)) -> T,
{
self.zip(other.into_iter()).map(f) // |(x, y)| f(x, y))
}
}

可以按如下方式使用:

    #[test]
fn test_zip_map() {
assert_equal((1..5).zip_map(1..5, |(a, b)| a + b), vec![2, 4, 6, 8]);
assert_equal((1..5).zip_map(1..5, |(a, b)| a * b), vec![1, 4, 9, 16]);
}

但是,我希望它能够像这样使用:

    #[test]
fn test_zip_map() {
assert_equal((1..5).zip_map(1..5, |a, b| a + b), vec![2, 4, 6, 8]);
assert_equal((1..5).zip_map(1..5, |a, b| a * b), vec![1, 4, 9, 16]);
^^^^^^
no parentheses
}

有谁知道如何修改 zip_map 来实现这个?

谢谢!

最佳答案

不幸的是,因为我们不能命名闭包的名称,也不能使用 impl Fn... 作为 map 第二个泛型我们必须使用 Boxed 特征对象。

use std::iter::Map;
use std::iter::Zip;

pub trait Iterx: Iterator {
fn zip_map<U, T, F>(
self,
other: U,
f: F,
) -> Map<
Zip<Self, U::IntoIter>,
Box<dyn Fn((<Self as Iterator>::Item, <U as IntoIterator>::Item)) -> T>,
>
where
Self: Sized,
U: IntoIterator,
F: Fn(<Self as Iterator>::Item, <U as IntoIterator>::Item) -> T + 'static,
{
self.zip(other.into_iter()).map(Box::new(move |(x, y)| f(x, y)))
}
}
impl<I> Iterx for I where I: Iterator {}

#[test]
fn test_zip_map() {
assert_eq!(
(1..5)
.into_iter()
.zip_map(1..5, |a, b| a + b)
.collect::<Vec<_>>(),
vec![2, 4, 6, 8]
);
}

关于rust - 如何使 Rust 函数 `zip_map` 采用二元函数而不是以二元组作为参数的一元函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74609203/

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