rust 如何在pyo3中删除应用程序的生存期要求

wlzqhblo  于 2023-04-06  发布在  其他
关注(0)|答案(1)|浏览(72)

这是一个简化的问题:我有个特点

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约束--它想要一个生命周期参数。

cotxawn7

cotxawn71#

使用HRTB:

impl < T > GetIter for NoRef< T > 
    where for <'a>  &'a T: GetIter,
{
    type IntoIter = Vec<usize>;
    fn get_iter( & self )-> Vec<usize> { 
        (&self.inner).get_iter().into_iter().collect() 
    }
}

只是为了增加细节,你可以用一个例子来检查它是否正确编译/执行:

impl <'a> GetIter for &'a Vec<usize> { 
    type IntoIter=Vec<usize>; 
    
    fn get_iter(&self)->Self::IntoIter { 
        (*self).clone() 
    } 
}

相关问题