Время жизни поля ржавчины - PullRequest
       86

Время жизни поля ржавчины

0 голосов
/ 22 апреля 2020

Я думаю, что это что-то очевидное, что я упускаю, но здесь идет ..

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(())
    }
}

Я прочитал главу книги о ржавчине о жизни, но не мог понять, что здесь не так. То, что я пытаюсь сделать, это построить основную c архитектуру канала и фильтра. Источник знает свой приемник, а приемник знает его источник, поэтому я хочу хранить ссылки на объекты. Очевидно, здесь есть проблема времени жизни.

Сначала я подумал о введении времени жизни 'a, чтобы сказать, что источник / приемник будет жить так же долго, как и объект, с которым он связан. Это не работает. Теперь я думаю, что мне может понадобиться целая жизнь "b", которая переживет "a" и каким-то образом выбросит это в смесь, но, как вы можете видеть, это то, где я запутался.

1 Ответ

0 голосов
/ 22 апреля 2020

Вы почти у цели:

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(())
    }
}

Детская площадка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...