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

 

分类: 编程语言 标签: 发布于: 2021-06-25 14:17:54, 点击数: