这是一个简化的问题:我有个特点
pub trait GetIter {
type IntoIter: IntoIterator<Item=usize>;
fn get_iter( &self ) -> Self::IntoIter;
}
有几个用例我可以在引用&'a T
上实现GetIter
,但不能在T
上实现。这对于纯Rust来说很好,但最近我需要用pyo 3构建一个python接口。
由于pyo 3 Package 器与生存期参数不兼容,我想做如下事情
pub struct NoRef< T > { inner: T }
impl <T> GetIter for NoRef< T >
where &T: GetIter
{
type IntoIter = Vec<usize>;
fn get_iter( &self )-> Vec<usize> {
(&self.inner).get_iter().into_iter().collect()
}
}
也就是说,我们在内部创建一个临时引用,足够长的时间来将迭代器的内容转储到一个向量中,然后删除引用。问题是Rust不喜欢&T: GetIter
约束--它想要一个生命周期参数。
1条答案
按热度按时间cotxawn71#
使用HRTB:
只是为了增加细节,你可以用一个例子来检查它是否正确编译/执行: