如何解决如何创建返回平面图的特征
我正在尝试创建一个特征,该特征从字符串扩展迭代器并返回平面图,这就是我到目前为止所得到的
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,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,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语法表达相同的含义,因为trait中没有impl Trait
语法。所以...我有两个选择,动态分配和泛型,它们都不是理想的。走得更远。由于这些结构没有大小,因此我无法在其上使用静态分派,因此我只能将动态分派停留在简单的事情上
无效的结构波纹管
struct Words<'a>(Iterator<Item = &'a str>);
最后,我希望给定一个函数F(X)
,我将能够始终将其重构以编写一个X.F()
,但这似乎并不正确,因为尽管我能够编写{{ 1}}我无法表达fn f(x) -> impl Y
,最后不再重复使用泛型或动态分配。
我试图用一种流利的语法编写迭代器组合器:trait X { fn (self) -> impl Y }
解决方法
我通过更改代码来编译您的代码:
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(" "))
}
}
诀窍是用实际的函数类型替换函数特征对象。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。