В чем разница между `& Trait` и` & impl Trait`?

struct SA {
    sa: u32,
}

trait T1 {
    // fn action_static() -> bool {
    //     true
    // }
    fn action_ins(&self) -> bool {
        true
    }
}

impl T1 for SA {}

fn do_action_1(x: &T1) {
    x.action_ins();
}

fn do_action_2(x: &impl T1) {
    x.action_ins();
    // <SA as T1>::action_static();
}

fn main() {
    let sa = SA { sa: 123 };
    // do_action_1(&sa);
    do_action_2(&sa);
}

детская площадка

Я хочу иметь статические функции признаков для хранения метаданных в структурах, сгенерированных макросами, но компилятор хочет where Self: Sized, когда признак используется как объект признака (&T1).

В чем разница между чертой &T1 и &impl T1?

С &impl T1 компилятор, похоже, знает тип во время компиляции и не требует Sized для моих статических функций-признаков - так зачем мне использовать объекты-признаки (&T1)?


person zino    schedule 09.11.2020    source источник