Псевдонимов трейтов сейчас нет в стабильном Rust, но я попытался имитировать их (давая более приятное имя конкретному типу закрытия), выполнив
trait MyCallback: FnMut(&u32) -> () { }
impl<F: FnMut(&u32) -> ()> MyCallback for F { }
, который отлично работал для других типов псевдонимов черт, которые мне нужны. Но затем, когда я попытался использовать псевдоним трейта, у меня возникли проблемы на протяжении всей жизни (?), Которые я не мог решить. Рассмотрим следующие две повторяющиеся функции, только с заменой MyCallback
на «определение» во втором случае.
fn process_data(mut f: impl MyCallback) -> () {
f(&0)
}
fn process_data_2(mut f: impl FnMut(&u32) -> ()) -> () {
f(&0)
}
fn main() {
// Doesn't compile
process_data(|_| ());
// Compiles
process_data_2(|_| ());
}
(Полный пример на Playground .) Как уже говорилось, функция, использующая псевдоним, не примет аргумент, который я хочу передать. Я бы предположил, что мне нужно вручную вставить несколько значений времени жизни в определение признака, чтобы имитировать то, что компилятор неявно делает при синтаксическом анализе process_data_2
, но я не могу понять, как действовать (мои попытки вставить предложения for<'a>
, о чем я только что узнал, все не удалось).
Как я могу скомпилировать свой код?