我是新来拉斯特的。
我的任务是创建将Iterator<&str>
、Iterator<String>
、Iterator<io::Result<String>>
转换为Iterator<MyRecord>
的函数,以便逐行流阅读大型文本文件,并使用简单的vec!["...","..."]
进行测试
经过几个小时的大脑fng我解决了它,但它不是很漂亮...
1.在io::Result<String>
没有共同特征AsRef<str>
的情况下,我定义了自己的特征StringRef
,并在&str
、String
和io::Result<String>
上实现了它
1.我为自己迭代器创建结构:
struct ReaderIterator<'a,S:StringRef> {
lines: Box<dyn Iterator<Item=S> + 'a>,
}
并在其上实现Iterator<MyRecord>
。
一切正常。使命完成。
但我仍然不满意这个代码。
Box
-可能应该更好AsRef
dyn XXX
-可能更好<'a,S:StringRef, I> where I:Iterator...
我试着用以下的话来代替:
struct ReaderIterator<'a,S:StringRef> {
lines: AsRef<dyn Iterator<Item=S> + 'a>,
}
不工作-error[E0782]: trait objects must include the
动态keyword
再来一次
struct ReaderIterator<'a,S:StringRef> {
lines: dyn AsRef<dyn Iterator<Item=S> + 'a>,
}
不工作-expected trait object
动态AsRef , found struct
框',而其中是框的AsRef特性...
tryes广义迭代器:
struct ReaderIterator<'a,S:StringRef, I> where I:Iterator<Item = S> {
lines: Box<I + 'a>,
}
不工作-not a trait
struct ReaderIterator<'a,S:StringRef, I> where I:Iterator<Item = S> + 'a {
lines: I,
}
灾难性的unused parameter a,
,unused parameter S
-为什么不使用它们,如果我在哪里使用它们?
请,谁能解释-如何正确地泛化实体一些(AsRef)引用到一些(I)迭代器,迭代一些(S)StringRef特性???
而不是Box引用某个(S)String引用上的某个迭代器
真的卡住了。
2条答案
按热度按时间lyr7nygr1#
类似这样的方法应该可以奏效:
ukdjmx9f2#
通过此修复,它删除了将显式生存期作为附加奖励的要求:
没有了。
在Kotlin/Java/C#中,我们有更简单的泛型语义,这是一种神奇的东西