Rust dyn 关键字
关键字 dyn
dyn是trait对象类型的前缀。
use std::collections::HashMap;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let resp = reqwest::blocking::get("https://httpbin.org/ip")?
.json::<HashMap<String, String>>()?;
println!("{:#?}", resp);
Ok(())
}
dyn关键字用于强调对相关trait的方法的调用是动态分配的。要以这种方式使用trait,它必须是 "对象安全 "的。
与泛型参数或植入型特质不同,编译器不知道被传递的具体类型。也就是说,该类型已经被抹去。因此,一个dyn Trait引用包含两个指针。一个指针指向数据(例如,一个结构的实例)。另一个指针指向方法调用名称与函数指针的映射(被称为虚拟方法表或vtable)。
在运行时,当一个方法需要在dyn Trait上被调用时,vtable被查询以获得函数指针,然后该函数指针被调用。
权衡利弊
上述间接性是在dyn Trait上调用一个函数的额外运行时成本。由动态调度调用的方法一般不能被编译器内联。
然而,dyn Trait可能会比impl Trait/泛型参数产生更小的代码,因为该方法不会为每个具体类型重复。
阅读更多关于对象安全和trait对象的信息。
https://doc.rust-lang.org/book/ch17-02-trait-objects.html