AsRef
это черта, а не тип.Ваше определение f1()
использует его вместо типа.Этот унаследованный синтаксис короток для dyn AsRef<Path>
и обозначает произвольный тип, реализующий черту AsRef<Path>
, с динамической диспетчеризацией во время выполнения.Размер произвольного типа, реализующего черту, очевидно, неизвестен во время компиляции, поэтому вы можете использовать объекты черт только за указателями, например, &dyn AsRef<Path>
или Box<dyn AsRef<Path>>
.Компилятор не жалуется на то, что размер Path
неизвестен, он жалуется на то, что размер объекта черты неизвестен.
Границы черт для универсальных типов, с другой стороны, ожидают черты, а не типы.P
снова является произвольным типом, реализующим AsRef<Path>
, но этот произвольный тип должен быть известен во время компиляции, и компилятор выдает новую скомпилированную версию f2()
для каждого фактически используемого типа.Таким образом, размер каждого отдельного типа известен во время компиляции.