Rust 为什么AsRef不能用作参数类型注释,但可以使用泛型声明?

Rust 为什么AsRef不能用作参数类型注释,但可以使用泛型声明?,rust,Rust,使用std::path::path; //fn f1(p:AsRef){ //println!(“{}”,p.as_ref().display()); // } fn f2(p:p){ println!(“{}”,p.as_ref().display()); } fn main(){ f2(“/tmp/test.jpg”); } 编译器会抱怨f1的路径大小未知,因为AsRef是一种特征,而不是一种类型。f1()的定义使用它来代替类型。这个遗留语法是dynasref的缩写,表示实现traitAs

使用std::path::path;
//fn f1(p:AsRef){
//println!(“{}”,p.as_ref().display());
// }
fn f2(p:p){
println!(“{}”,p.as_ref().display());
}
fn main(){
f2(“/tmp/test.jpg”);
}

编译器会抱怨f1的路径大小未知,因为AsRef是一种特征,而不是一种类型。
f1()
的定义使用它来代替类型。这个遗留语法是
dynasref
的缩写,表示实现trait
AsRef
的任意类型,并在运行时进行动态调度。实现trait的任意类型的大小在编译时显然是未知的,因此您只能在指针后面使用trait对象,例如
&dynasref
Box
。编译器不会抱怨
Path
的大小未知,而是抱怨trait对象的大小未知


另一方面,泛型类型上的特征边界期望的是特征,而不是类型
P
也是一种实现
AsRef
的任意类型,但这种任意类型需要在编译时知道,编译器会为实际使用的每种类型发出一个新的编译版本的
f2()
。这样,每个类型的大小在编译时都是已知的。

AsRef
是一种特性,而不是类型。
f1()
的定义使用它来代替类型。这个遗留语法是
dynasref
的缩写,表示实现trait
AsRef
的任意类型,并在运行时进行动态调度。实现trait的任意类型的大小在编译时显然是未知的,因此您只能在指针后面使用trait对象,例如
&dynasref
Box
。编译器不会抱怨
Path
的大小未知,而是抱怨trait对象的大小未知


另一方面,泛型类型上的特征边界期望的是特征,而不是类型
P
也是一种实现
AsRef
的任意类型,但这种任意类型需要在编译时知道,编译器会为实际使用的每种类型发出一个新的编译版本的
f2()
。这样,在编译时就可以知道每种类型的大小。

非常感谢您的精彩解释。我现在可以理解泛型是如何工作的了。非常感谢你的精彩解释。我现在可以理解泛型在这里是如何工作的了。