LINUX.ORG.RU

История изменений

Исправление khrundel, (текущая версия) :

Уже выясняли выше по треду (ну, я выяснял), что это не анонимный тип, а тип, считающийся анонимным в данной конкретной точке с точки зрения вывода типов.

Не совсем. Как я уже писал, вывод типов в расте работает внутри функции, информацию о внешних по отношению к функции типов тайпчекер берет из прототипов. Из этого следует, что компилятор в состоянии отождествить тип двух значений, полученных из одной функции, даже не смотря на анонимизированность, но обломает, если значения получены из разных функций








fn debugize(val: i32) -> impl std::fmt::Debug {
    val
}

fn debugize_another(val: i32) -> impl std::fmt::Debug {
    val
}

fn want_same_type<T: std::fmt::Debug>(a: T, b: T) {
    println!("{:?} and {:?}", a, b);
}

fn main() {
    want_same_type(debugize(1), debugize(2)); // норм, значения получены из одной функции
    // want_same_type(debugize(1), debugize_another(1)); // тут ошибка, несовпадение типов
}
Из чего следует, что в принципе rustc мог бы давать понятное сообщение типа «ожидается тип возврата debugize(), а получен тип возврата debugize_another()»

Исходная версия khrundel, :

Уже выясняли выше по треду (ну, я выяснял), что это не анонимный тип, а тип, считающийся анонимным в данной конкретной точке с точки зрения вывода типов.

Не совсем. Как я уже писал, вывод типов в расте работает внутри функции, информацию о внешних по отношению к функции типов тайпчекер берет из прототипов. Из этого следует, что компилятор в состоянии отождествить тип двух значений, полученных из одной функции, даже не смотря на анонимизированность, но обломает, если значения получены из разных функций








fn debugize(val: i32) -> impl std::fmt::Debug {
    val
}

fn debugize_another(val: i32) -> impl std::fmt::Debug {
    val
}

fn want_same_type<T: std::fmt::Debug>(a: T, b: T) {
    println!("{:?} and {:?}", a, b);
}

fn main() {
    want_same_type(debugize(1), debugize(2)); // норм, значения получены из одной функции
    // want_same_type(debugize(1), debugize_another(1)); // тут ошибка, несовпадение типов
}