None
RU
Что там с trait upcasting: год спустя
[]
Все публикации подряд на Хабре
Trait upcasting наконец стабилизирован: &dyn Sub спокойно кастится в &dyn Super , если trait Sub: Super .
Приведение трейт-объекта — это когда &dyn Sub превращается в &dyn Super , где trait Sub: Super .
Есть у нас let x = MyType; , и MyType реализует и Sub, и Super, тогда и &x as &dyn Sub , и &x as &dyn Super работали с Rust 1.0.
Проблема начиналась там, где конкретный тип уже потерян под dyn:fn take_super(x: &dyn Super) { x.base(); } fn call_it(sub: &dyn Sub) { take_super(sub); // до 1.86: expected `&dyn Super`, found `&dyn Sub` }Компилятор знал, что каждый Sub также Super , но всё равно спотыкался.
Компилятор знает, что в vtable Sub на известном заранее смещении лежит указатель на vtable Super.