Почему AsRef нельзя использовать в качестве аннотации типа параметра, но это прекрасно с общим объявлением? - PullRequest
0 голосов
/ 28 января 2019

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

use std::path::Path;

// fn f1(p: AsRef<Path>) {
//     println!("{}", p.as_ref().display());
// }

fn f2<P: AsRef<Path>>(p: P) {
    println!("{}", p.as_ref().display());
}

fn main() {
    f2("/tmp/test.jpg");
}

Компилятор будет жаловаться на размер Path, неизвестного для f1

1 Ответ

0 голосов
/ 28 января 2019

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...