gpt4 book ai didi

rust - 为什么 AsRef 不能用作参数类型注释但可以用于泛型声明?

转载 作者:行者123 更新时间:2023-11-29 08:23:23 24 4
gpt4 key购买 nike

playground

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 size is not known for f1

最佳答案

AsRef是一种特质,而不是一种类型。您对 f1() 的定义使用它代替类型。此旧语法是 dyn AsRef<Path> 的缩写, 并表示实现特征 AsRef<Path> 的任意类型,在运行时动态调度。实现特征的任意类型的大小在编译时显然是未知的,因此您只能在指针后面使用特征对象,例如&dyn AsRef<Path>Box<dyn AsRef<Path>> .编译器不会提示 Path 的大小未知,它提示特征对象的大小未知。

另一方面,通用类型的特征界限,期望特征,而不是类型。 P again 是实现 AsRef<Path> 的任意类型,但是这个任意类型需要在编译时知道,并且编译器发出一个新的编译版本 f2()对于实际使用的每种类型。这样,每个单独类型的大小在编译时都是已知的。

关于rust - 为什么 AsRef 不能用作参数类型注释但可以用于泛型声明?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54397834/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com