Куда я помещаю время жизни в методе черты, чтобы вернуть объект с изменяемой ссылкой на аргумент для типа, параметризованного временем жизни? - PullRequest
0 голосов
/ 15 апреля 2020

Я пытаюсь спрятать nix::dir::{Dir, Entry, Iter} за чертой, чтобы я мог провести фазз-тестирование моего приложения без скремблирования моей реальной файловой системы, предоставив имитационную реализацию этой черты.

В качестве упрощенной модели проблема, я написал это:

#[derive(Debug)]
pub struct Source(u8);
// this is similar to nix::dir::Dir;
#[derive(Debug)]
pub struct Ref<'a>(&'a mut Source, usize);
// this is similar to nix::dir::Iter
// which implements Iterator<Item = nix::Result<nix::dir::Entry>>

trait Foo<T, R> {
    fn borrow(&self, source: &mut T) -> R;
}

impl Foo<Source, Ref<'_>> for () {
    fn borrow<'a>(&self, source: &'a mut Source) -> Ref<'a> {
        Ref(source, 0)
    }
}

fn main() {
    println!("{:#?}", ().borrow(&mut Source(13)));
}

Когда я пытаюсь скомпилировать это с cargo run --bin sandbox на стабильном Rust, я получаю эту ошибку:

error: `impl` item signature doesn't match `trait` item signature
  --> src/sandbox.rs:14:5
   |
10 |     fn borrow(&self, source: &mut T) -> R;
   |     -------------------------------------- expected fn(&(), &mut Source) -> Ref<'_>
...
14 |     fn borrow<'a>(&self, source: &'a mut Source) -> Ref<'a> {
   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ found fn(&(), &mut Source) -> Ref<'_>
   |
   = note: expected `fn(&(), &mut Source) -> Ref<'_>`
              found `fn(&(), &mut Source) -> Ref<'_>`

"Ожидаемый" и " найденные части выглядят равными мне. Что происходит?

Где (если где-либо) я помещаю параметры времени жизни так, чтобы я мог вернуть новый объект, содержащий изменяемую ссылку на аргумент из метода черты, когда тип этого объекта параметризован временем жизни ?

Полагаю, что вместо возврата итератора я мог бы поручить реализации своих черт отвечать за выполнение итерации и вернуть вектор, или я могу взять обратный вызов, или что-то еще - я уверен, что смогу решить свои практические задачи. проблема, но я бы хотел немного лучше понять Rust.

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