gpt4 book ai didi

closures - 如何返回一个通用的 Map 结构?

转载 作者:行者123 更新时间:2023-11-29 07:54:42 24 4
gpt4 key购买 nike

我不确定如何返回通用 Map现在构造 Map 的声明已经改变。新声明是:

pub struct Map<A, B, I: Iterator<A>, F: FnMut<(A,), B>> {
// some fields omitted
}

我不确定如何从函数返回其中之一:

fn something<A: Clone, I: Iterator<A>>(iter: I) -> Map<A, (A,A), I, **what goes here**> {
iter.map(|x| (x.clone(), x))
}

我已经尝试使用我正在使用的闭包的签名...

fn something<A: Clone, I: Iterator<A>>(iter: I) -> Map<A, (A,A), I, |A| -> (A,A)> {
iter.map(|x| (x.clone(), x))
}

但是 rust 提示我需要一个明确的生命周期限制。我不确定为什么需要这个,但我还是添加了它:

fn something<'a, A: Clone, I: Iterator<A>>(iter: I) -> Map<A, (A,A), I, |A|:'a -> (A,A)> {
iter.map(|x| (x.clone(), x))
}

但随后我收到错误:the trait core::ops::Fn<(A,), (A, A)> is not implemented for the type 'a |A|:'a -> (A, A)

我无法取得进一步的进展,此时我只是在尝试一些随机的事情。谁能帮助我了解如何使用新的 Map结构?

最佳答案

你不能在**what goes here**中放任何有意义的东西。您定义的闭包有一个编译器生成的类型,您无法命名(也就是说,直到 abstract return types 被实现)。

因为你的闭包没有从它的环境中捕获任何东西,你可以用一个普通的函数来替换它。

use std::iter::Map;

fn duplicate<T: Clone>(a: T) -> (T, T) {
(a.clone(), a)
}

fn something<A: Clone, I: Iterator<A>>(iter: I) -> Map<A, (A,A), I, fn(A) -> (A, A)> {
iter.map(duplicate as fn(A) -> (A, A)) // cast required since PR #19891
}

但是,如果您确实需要捕获某些状态,目前您能做的最好的事情(不求助于装箱)是定义您自己的类型来实现 FnMut。 (这个例子有一个空结构,因为没有状态;call_mut 可以通过 self 访问和改变结构的状态。)

#![feature(unboxed_closures)]

use std::iter::Map;

struct Duplicate;

impl<T: Clone> FnMut(T) -> (T, T) for Duplicate {
extern "rust-call" fn call_mut(&mut self, (a,): (T,)) -> (T, T) {
(a.clone(), a)
}
}

fn something<A: Clone, I: Iterator<A>>(iter: I) -> Map<A, (A,A), I, Duplicate> {
iter.map(Duplicate)
}

关于closures - 如何返回一个通用的 Map 结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27496278/

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