(rust)如何将Box〈dyn T+'a>替换为更通用的'AsRef'

vdzxcuhz  于 2022-12-19  发布在  其他
关注(0)|答案(2)|浏览(150)

我是新来拉斯特的。
我的任务是创建将Iterator<&str>Iterator<String>Iterator<io::Result<String>>转换为Iterator<MyRecord>的函数,以便逐行流阅读大型文本文件,并使用简单的vec!["...","..."]进行测试
经过几个小时的大脑fng我解决了它,但它不是很漂亮...
1.在io::Result<String>没有共同特征AsRef<str>的情况下,我定义了自己的特征StringRef,并在&strStringio::Result<String>上实现了它
1.我为自己迭代器创建结构:

struct ReaderIterator<'a,S:StringRef> {
    lines: Box<dyn Iterator<Item=S> + 'a>,
}

并在其上实现Iterator<MyRecord>
一切正常。使命完成。
但我仍然不满意这个代码。

  1. Box-可能应该更好AsRef
  2. 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引用上的某个迭代器
真的卡住了。

lyr7nygr

lyr7nygr1#

类似这样的方法应该可以奏效:

struct ReaderIterator<I>
where
    I: Iterator,
    I::Item: StringRef,
{
    lines: I,
}
ukdjmx9f

ukdjmx9f2#

通过此修复,它删除了将显式生存期作为附加奖励的要求:

struct ReaderIterator<I>
where
    I: Iterator,
    I::Item : StringRef,
{
    lines: I,
}

没有了。
在Kotlin/Java/C#中,我们有更简单的泛型语义,这是一种神奇的东西

相关问题