我认为这很明显我想念的东西,但是这是..
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
,即说源/接收器只要与它链接的对象就应该存在。这是行不通的。现在,我想我可能需要一生的'b',它要比'a寿命长,然后以某种方式将其扔进去,但是正如您所看到的,这就是我感到困惑的地方。
您几乎在那里:
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(())
}
}