gpt4 book ai didi

rust - 如何创建返回平面图的特征

转载 作者:行者123 更新时间:2023-12-03 11:29:51 25 4
gpt4 key购买 nike

我正在尝试创建一个从字符串扩展迭代器并返回平面 map 的特征,这是我到目前为止所得到的

trait WordsExt<'a, F>: Iterator<Item = &'a str>
where
Self: Sized,
F: FnMut(&'a str) -> Split<'a, &'a str>,
{
fn words(self) -> FlatMap<Self, Split<'a, &'a str>, F> {
self.flat_map(|x: &'a str| x.split(" "))
}
}
我被困在封闭类型上。
我也试过这个
struct Words<'a, I>
where
I: Iterator<Item = &'a str>,
{
inner: I,
}

trait WordsExt<'a>: Iterator<Item = &'a str>
where
Self: Sized,
{
fn words(
self,
) -> Words<'a, FlatMap<Self, Split<'a, &'a str>, Fn(Self::Item) -> Split<'a, &'a str>>>
{
Words {
inner: self.flat_map(|x: &'a str| x.split(" ")),
}
}
}
我只是每次都遇到这个问题。我需要返回一个特征。当我在一个函数中时,我可以使用 impl Trait句法。但是当表达一个特质时,我无法表达这一点。据我所知,我越接近使用泛型,以便该方法在调用时是单态的。但是我需要让用户选择具体类型。在这种情况下,闭包是实现细节,它不应该泄漏给用户。
我遇到了这个答案 How can I add new methods to Iterator?
在这种情况下,OP 用例具有内部状态。就我而言,我只想创建一个别名 i.words() -> i.flat_map(|x| x.split(" "))我知道一致性,所以我可能需要在 Iterator 上创建一个包装器,因为 Iterator 不在我的箱子里。这是第二次尝试。
我可以通过简单的方式实现一个功能
fn words<'a>(i: impl Iterator<Item = &'a str>) -> impl Iterator<Item = &'a str> {
i.flat_map(|x| x.split(" "))
}
但是我不能用 trait 语法表达同样的意思,因为没有 impl Trait特征中的语法。所以......我有两个选择,动态调度和泛型,它们都不是理想的。更进一步。由于这些结构未调整大小,因此我无法对其使用静态调度,因此我坚持使用动态调度来处理一些简单的事情
无效的结构波纹管
struct Words<'a>(Iterator<Item = &'a str>);
最后,我期望给出一个函数 F(X)我总是能够重构它来写一个 X.F() ,但这似乎不是真的,因为虽然我可以写 fn f(x) -> impl Y我无法表达 trait X { fn (self) -> impl Y } ,最后不会重复泛型或动态调度。
我试图用一种流畅的语法编写迭代器组合器: iterator.comb1().comb2().comb3()

最佳答案

我通过如下更改来编译您的代码:

trait WordsExt<'a>: Iterator<Item = &'a str>
where
Self: Sized,
{
fn words(self) -> FlatMap<Self, Split<'a, &'a str>, fn(&'a str) -> Split<'a, &'a str>> {
self.flat_map(|x: &'a str| x.split(" "))
}
}
诀窍是用实际的函数类型替换函数特征对象。

关于rust - 如何创建返回平面图的特征,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63351383/

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