首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >锈性状场寿命

锈性状场寿命
EN

Stack Overflow用户
提问于 2020-04-22 09:43:11
回答 1查看 69关注 0票数 0

我想这是我明显遗漏的东西,但这里有..

代码语言:javascript
复制
use std::io;

pub trait Source<'a, T> {
    fn push(&self, t: T) -> io::Result<()>;

    fn link(&mut self, sink: &dyn Sink<'a, T>) -> io::Result<()>;
}

pub trait Sink<'a, T> {
    fn push(&self, t: T) -> io::Result<()>;

    fn link(&mut self, source: &dyn Source<T>) -> io::Result<()>;
}

pub struct SyncSource<'a, T> {
    sink: Option<&'a dyn Sink<'a, T>>,
}

impl<'a, T> SyncSource<'a, T> {
    pub fn new() -> SyncSource<'a, T> {
        SyncSource {
            sink: None,
        }
    }
}

impl<'a, T> Source<'a, T> for SyncSource<'a, T> {
    fn push(&self, t: T) -> io::Result<()> {
        match self.sink {
            Some(sink) => sink.push(t),
            None => Err(io::Error::new(io::ErrorKind::NotConnected, "no sink")),
        }
    }

    fn link(&mut self, sink: &dyn Sink<'a, T>) -> io::Result<()> {
        self.sink = Some(sink);
        Ok(())
    }
}

pub struct SyncSink<'a, T> {
    source: Option<&'a dyn Source<'a, T>>,
}

impl<'a, T> SyncSink<'a, T> {
    pub fn new() -> SyncSink<'a, T> {
        SyncSink {
            source: None,
        }
    }
}

impl<'a, T> Sink<'a, T> for SyncSink<'a, T> {
    fn push(&self, t: T) -> io::Result<()> {
        match self.source {
            Some(source) => source.push(t),
            None => Err(io::Error::new(io::ErrorKind::NotConnected, "no source")),
        }
    }

    fn link(&mut self, source: &dyn Source<T>) -> io::Result<()> {
        self.source = Some(source);
        Ok(())
    }
}

我读过rustlang书中关于生命的章节,但不能真正理解这里的问题所在。我要做的是构建一个基本的管道和过滤器架构。源知道它的接收器,而接收器知道它的源,因此我想存储对对象的引用。显然,这是一个终生的问题。

我首先想到的是引入生存期'a,即源/宿应该和它所链接的对象一样长。这不起作用。现在我在想,我可能需要一个比a寿命更长的'b‘,并以某种方式将其混为一谈,但正如你所看到的,这就是我困惑的地方。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-22 12:42:40

你就快成功了:

代码语言:javascript
复制
use std::io;

pub trait Source<'a, T> {
    fn push(&self, t: T) -> io::Result<()>;

    // Make sure the references themselves have the 'a lifetime marker
    fn link(&'a mut self, sink: &'a dyn Sink<'a, T>) -> io::Result<()>; 
}

pub trait Sink<'a, T> {
    fn push(&self, t: T) -> io::Result<()>;

    // Make sure the references themselves have the 'a lifetime marker
    fn link(&'a mut self, source: &'a dyn Source<'a, T>) -> io::Result<()>; 
}

pub struct SyncSource<'a, T> {
    sink: Option<&'a dyn Sink<'a, T>>,
}

impl<'a, T> SyncSource<'a, T> {
    pub fn new() -> SyncSource<'a, T> {
        SyncSource {
            sink: None,
        }
    }
}

impl<'a, T> Source<'a, T> for SyncSource<'a, T> {
    fn push(&self, t: T) -> io::Result<()> {
        match self.sink {
            Some(sink) => sink.push(t),
            None => Err(io::Error::new(io::ErrorKind::NotConnected, "no sink")),
        }
    }

    // Now match the lifetime definitions that is defined in the trait
    fn link(&'a mut self, sink: &'a dyn Sink<'a, T>) -> io::Result<()> {
        self.sink = Some(sink);
        Ok(())
    }
}

pub struct SyncSink<'a, T> {
    source: Option<&'a dyn Source<'a, T>>,
}

impl<'a, T> SyncSink<'a, T> {
    pub fn new() -> SyncSink<'a, T> {
        SyncSink {
            source: None,
        }
    }
}

impl<'a, T> Sink<'a, T> for SyncSink<'a, T> {
    fn push(&self, t: T) -> io::Result<()> {
        match self.source {
            Some(source) => source.push(t),
            None => Err(io::Error::new(io::ErrorKind::NotConnected, "no source")),
        }
    }

    // Now match the lifetime definitions that is defined in the trait
    fn link(&'a mut self, source: &'a dyn Source<'a, T>) -> io::Result<()> {
        self.source = Some(source);
        Ok(())
    }
}

Playground

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61355940

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档