【发布时间】:2015-10-31 23:23:24
【问题描述】:
在本例中,NoGood 是 pub,AtomWord 是私有的。
我想导出IntoIterator 的一个实例,但我不能,因为IntoIter 的这个巨大的类型定义包含对AtomWord 的引用。
我意识到我可以创建一个 Iterator 包装器,它只是将调用传递给底层迭代器,但这是很多样板。我想不出任何方法来使包装类通用(不违背目的,即隐藏AtomWord 类型)。
impl <'a> IntoIterator for &'a NoGood {
type Item = Literal;
type IntoIter = FilterMap<slice::Iter<'a, AtomWord>, fn(&AtomWord) -> Option<Literal>>;
fn into_iter(self) -> Self::IntoIter {
(&self.lits).into_iter().filter_map(as_opt_lit)
}
}
【问题讨论】:
-
实际上,如果 Rust 有类似 GeneralizedNewtypeDeriving 的东西,包装类解决方案会非常好。是吗?
-
因为这里只有一个特征和一种方法需要实现,所以包装器解决方案似乎被接受(虽然不理想,但显然)。
-
或者将迭代器装箱:
type IntoIter = Box<Iterator<Item=Literal>> -
@dspyz 很遗憾,它还没有这个功能(还没有?)。不过,我很想在一般委托和包装器结构方面有所帮助。
-
这个问题talks a bit more关于
GeneralizedNewtypeDeriving。
标签: types rust private encapsulation public