Я пытаюсь спрятать 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.