История изменений
Исправление 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)); // тут ошибка, несовпадение типов
}
Исходная версия 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)); // тут ошибка, несовпадение типов
}