未来循环的生命周期和所有权

时间:2017-12-24 12:23:53

标签: rust lifetime

我实现了一个特征Fetcher,用于从端点(服务器,数据库等)获取特定内容,所有这些都是用期货完成的:

pub trait Fetcher {
    type Content: 'static;
    type Error: 'static;

    fn fetch(&self, target: &str) -> Box<Future<Item = Vec<Self::Content>, Error = Self::Error>>;

    fn fetch_size<'a>(
        &'a self,
        size: usize,
    ) -> Box<Future<Item = Vec<Self::Content>, Error = Self::Error> + 'a> {
        let target = "some_endpoint";

        let fetch_items = move |mut result: Vec<Self::Content>| {
            self.fetch(target).and_then(move |items| {
                result.extend(items.into_iter());

                if result.len() > size {
                    Ok(Loop::Break(result))
                } else {
                    Ok(Loop::Continue(result))
                }
            })
        };

        let x = loop_fn(Vec::new(), fetch_items);
        Box::new(x)
    }
}

我有一台服务器,即使可用项目较大,也会以最多100个固定项目进行响应。我需要特定大小的结果,因此我实现了fetch_size函数,该函数使用futures crate的{​​{3}}返回未来循环。 loop_fn获取初始状态,在本例中为空向量和表示迭代操作的闭包。

fetch_items闭包取出一批物品,并检查result vec的大小是否超过要求的大小。如果确实如此,则循环应该中断,否则loop_fn应该再次调用fetch_items

由于fetch_items闭包借用self来执行fetch,我需要将所有权移至闭包,但这需要终身约束,我将在{{1到fetch_size。如果在同一范围内创建并删除&self的实例,则无法使用fetch_size作为未来链的返回值,因为只要{{{} {}未来依赖于现有Fetcher 1}}正在创建Fetcher

fetch_size

有没有办法在没有生命限制的情况下执行未来的循环?我尝试使用// a Dummy struct pub struct DummyImpl {} impl Fetcher for DummyImpl { type Content = String; type Error = String; fn fetch(&self, target: &str) -> Box<Future<Item = Vec<Self::Content>, Error = Self::Error>> { // dummy impl Box::new(futures::future::ok((vec!["".to_string()]))) } } fn main() { let mut core = Core::new().unwrap(); let dummy = DummyImpl {}; let work = dummy.fetch("some_endpoint").and_then(|content| { // represents a different Fetcher impl let dummy_2 = DummyImpl {}; // fails due bound to lifetime of dummy_2 dummy_2.fetch_size(100usize) // works: // let first = content.first().unwrap(); // dummy_2.fetch(first.as_str()) }); } ,但也无法使用它。

loop_fn

0 个答案:

没有答案