Устранение несоответствия типов Rust `for <'r> ...` с помощью аргумента псевдонима признака закрытия - PullRequest
4 голосов
/ 08 мая 2020

Псевдонимов трейтов сейчас нет в стабильном 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>, о чем я только что узнал, все не удалось).

Как я могу скомпилировать свой код?

Ответы [ 2 ]

4 голосов
/ 08 мая 2020

Чтобы он скомпилировался, вы можете добавить аннотацию типа к вашему замыканию:

process_data(|_: &u32| ());

Кажется, это связано с этой давней проблемой .

1 голос
/ 08 мая 2020

Если я понимаю ваше сообщение, вы пытаетесь использовать черту для создания типа «обратного вызова». Если это действительно , вам лучше использовать псевдоним функции, например:

pub type MyCallback = fn(&u32) -> ();

fn process_data(mut f: MyCallback) -> () {
    f(&0)
}

Сообщение об ошибке, которое вы получаете, связано с проблемой, опубликованной nnnmmm выше ... как раз в тот момент, когда я набирал этот пост: p

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