gpt4 book ai didi

rust - 除了使用“静态生命周期”以外的其他解决方案

转载 作者:行者123 更新时间:2023-12-03 11:29:04 30 4
gpt4 key购买 nike

这里的代码:

#[derive(Debug, Eq, PartialEq)]
struct Id(u128);

pub struct IdIter(Box<dyn Iterator<Item= Id>>);

impl IdIter {
pub fn new<I: Iterator<Item= Id>>(tmpl: I) -> Self {
Self(Box::new(tmpl))
}
}

impl Iterator for IdIter {
type Item = Id;

fn next(&mut self) -> Option<Self::Item> {
self.0.next()
}
}

pub trait Link {
fn iter_id(&self) -> IdIter;
}

pub fn links(it: impl Iterator<Item= impl Link>) -> impl Iterator<Item= Id> {
it.into_iter().flat_map(|l| l.iter_id())
}

#[cfg(test)]
mod test {
struct X(u128);

impl super::Link for X {
fn iter_id(&self) -> super::IdIter {
super::IdIter(Box::new(Some(super::Id(self.0)).into_iter()))
}
}

#[test]
fn test_links() {
let mut v = super::links([X(1234), X(4321)].into_iter());

assert_eq!(v.next(), Some(super::Id(1234u128)));
assert_eq!(v.next(), Some(super::Id(4321u128)));
assert_eq!(v.next(), None);
}
}

Playground

编译器建议使用“静态生存期”来解决问题,但这有点多余。

我想要的是提供一个特征(此处为 Link),该特征通过 links函数的迭代器提供了 Id实例的迭代器。该特征也用作标记特征,因此我不能使用其他库。

我该如何解决编译器错误?

最佳答案

在给出IdIter和明确的生存期并调整程序的某些部分之后,它将进行编译。这是complete playground example

#[derive(Debug, Eq, PartialEq)]
pub struct Id(u128);

pub struct IdIter<'a>(Box<dyn Iterator<Item = Id> + 'a>);

impl<'a> IdIter<'a> {
pub fn new<I: Iterator<Item = Id> + 'a>(tmpl: I) -> Self {
Self(Box::new(tmpl))
}
}

impl Iterator for IdIter<'_> {
type Item = Id;

fn next(&mut self) -> Option<Self::Item> {
self.0.next()
}
}

pub trait Link {
fn iter_id(&self) -> IdIter;
}

pub fn links<'a>(it: impl Iterator<Item = &'a (impl Link + 'a)> + 'a) -> impl Iterator<Item = Id> + 'a {
it.flat_map(Link::iter_id)
}

#[cfg(test)]
mod test {
struct X(u128);

impl super::Link for X {
fn iter_id(&self) -> super::IdIter {
super::IdIter(Box::new(Some(super::Id(self.0)).into_iter()))
}
}

#[test]
fn test_links() {
let mut v = super::links([X(1234), X(4321)].iter());

assert_eq!(v.next(), Some(super::Id(1234u128)));
assert_eq!(v.next(), Some(super::Id(4321u128)));
assert_eq!(v.next(), None);
}
}

关于rust - 除了使用“静态生命周期”以外的其他解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60905826/

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