如何在Rust中返回指定类型的空Peekable迭代器?
如何在Rust中返回指定类型的空Peekable迭代器?
我完全理解你的需求——你不想在调用方额外调用peekable(),而是希望函数直接返回Peekable<Box<dyn Iterator<Item = Result<R, FbError>> + 'a>>类型,出错时返回空的该类型迭代器对吧?其实关键是要把空迭代器先Box化,再用Peekable适配器包裹它,这样就能完美匹配目标返回类型了。
我们可以直接修改错误分支的代码,不需要大动:
use std::iter::Peekable; use rsfbclient::{SimpleConnection, IntoParams, FromRow, FbError}; use log::error; fn query_list_or_empty<'a, P, R>( conn: &'a mut SimpleConnection, sql: &'a str, params: P, ) -> Peekable<Box<dyn Iterator<Item = Result<R, FbError>> + 'a>> where P: rsfbclient::IntoParams, R: FromRow + 'static, { match conn.query_iter(sql, params) { Ok(iter) => iter.peekable(), Err(e) => { error!("Failed to execute query: {}", e); // 先创建空迭代器并Box化,再调用peekable()生成目标类型 Box::new(std::iter::empty::<Result<R, FbError>>()).peekable() } } }
为什么这样可行?
std::iter::empty::<Result<R, FbError>>()创建了一个空的迭代器,Item类型正好是我们需要的Result<R, FbError>Box::new(...)把这个空迭代器装箱,转换成Box<dyn Iterator<Item = Result<R, FbError>> + 'a>(Rust的类型推断会自动识别生命周期'a,因为返回类型明确要求了)- 最后调用
.peekable(),这个方法会把Boxed迭代器包裹进Peekable适配器中,正好得到我们需要的返回类型Peekable<Box<dyn Iterator<...> + 'a>>
这样修改后,函数就能直接返回你想要的类型,出错时返回的空迭代器也完全符合类型要求,不需要在调用方做额外的适配操作。
内容来源于stack exchange
相关产品推荐
相关产品推荐

