gpt4 book ai didi

iterator - 如何自动实现 FromIterator?

转载 作者:行者123 更新时间:2023-11-29 08:21:27 34 4
gpt4 key购买 nike

我写了一个 trait 指定了一些类似于 Vec 的方法:

pub trait Buffer {
type Item;
fn with_capacity(c: usize) -> Self;
fn push(&mut self, item: Self::Item);
}

我想实现 FromIterator对于所有实现 Buffer 的类型,如下所示:

impl<T> iter::FromIterator<T::Item> for T
where T: Buffer
{
fn from_iter<I>(iter: I) -> Self
where I: IntoIterator<Item = T>
{
let mut iter = iter.into_iter();
let (lower, _) = iter.size_hint();
let ans = Self::with_capacity(lower);
while let Some(x) = iter.next() {
ans.push(x);
}
ans
}
}

编译器不允许我:

error[E0210]: type parameter `T` must be used as the type parameter
for some local type (e.g. `MyStruct<T>`); only traits defined in the
current crate can be implemented for a type parameter

我想我理解了错误信息;它阻止我编写与标准库 future 可能发生的更改不兼容的代码。

解决此错误的唯一方法似乎是为我实现 Buffer 的每种类型单独实现 FromIterator。这将涉及多次复制出完全相同的代码。有没有办法在所有 Buffer 类型之间共享相同的实现?

最佳答案

您不能为任意类型实现来自另一个 crate 的特征,只能用于您 crate 中的类型。但是,您可以将实现移至函数并减少重复代码的数量:

fn buffer_from_iter<I, B>(iter: I) -> B
where I: IntoIterator<Item = B::Item>,
B: Buffer
{
let mut iter = iter.into_iter();
let (lower, _) = iter.size_hint();
let mut ans = B::with_capacity(lower);
while let Some(x) = iter.next() {
ans.push(x);
}
ans
}

struct S1;
impl Buffer for S1 {
type Item = i32;
fn with_capacity(c: usize) -> Self { unimplemented!() }
fn push(&mut self, item: Self::Item) { unimplemented!() }
}

impl std::iter::FromIterator<<S1 as Buffer>::Item> for S1 {
fn from_iter<I>(iter: I) -> Self
where I: IntoIterator<Item = <S1 as Buffer>::Item>
{
buffer_from_iter(iter)
}
}

FromIterator 的实现可以包装到一个宏中,以进一步减少代码重复。

关于iterator - 如何自动实现 FromIterator?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40688205/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com