【发布时间】:2020-07-12 21:49:21
【问题描述】:
我想制作一个适配器来删除通用参数(以生成特征对象),如下例所示。
use std::ops::Deref;
fn make_dyn_box<I, S>(iter_in: I)
where
I: Iterator<Item = S>,
S: Deref<Target = u8>,
{
let mut iter_out = iter_in.map(
|s| -> Box<dyn Deref<Target = u8>> {Box::new(s)}
);
take_dyn_box(&mut iter_out)
}
fn take_dyn_box<'a: 'b, 'b>(
iter: &'a mut (dyn 'a + Iterator<Item = Box<dyn 'b + Deref<Target = u8>>>),
) { }
有没有办法在不分配堆、只使用安全代码、不使用外部依赖项的情况下完成此任务?
以下是我想要的想法,但借用检查器不允许这样做。
use std::ops::Deref;
fn make_dyn<I, S>(iter_in: I)
where
I: Iterator<Item = S>,
S: Deref<Target = u8>,
{
let mut item = None;
let item = &mut item;
let mut iter_out = iter_in.map(|s| -> &dyn Deref<Target = u8> {
item.replace(s);
Option::as_ref(item).unwrap()
});
take_dyn(&mut iter_out)
}
fn take_dyn<'a: 'b, 'b>(
iter: &'a mut (dyn 'a + Iterator<Item = &'b (dyn 'b + Deref<Target = u8>)>),
) { }
【问题讨论】:
-
当您说“适配器”时,您是指特指迭代器适配器吗?
-
如果你可以使用一个引用迭代器,这个becomes very easy。但是,如果您有一个迭代器拥有它所迭代的值(或者更准确地说,产生拥有的值),您可能必须创建一个自定义迭代器,以某种方式至少存储每个产生的值,但产生特征对象(作为参考)。
标签: generics rust trait-objects