rust - Rust 是否删除泛型类型?

标签 rust type-erasure

Rust 中是否存在泛型的类型删除(就像在 Java 中一样)?我无法找到明确的答案。

最佳答案

当您使用泛型函数或泛型类型时,编译器会为每个不同的类型参数集生成一个单独的实例(我相信生命周期参数会被忽略,因为它们对生成的代码没有影响)。这个过程称为单态化。例如,Vec<i32>Vec<String>是不同的类型,因此 Vec<i32>::len()Vec<String>::len()是不同的功能。这是必要的,因为 Vec<i32>Vec<String>有不同的内存布局,因此需要不同的机器码!因此,,没有类型删除。

如果我们使用 Any::type_id() ,如以下示例所示:

use std::any::Any;

fn main() {
    let v1: Vec<i32> = Vec::new();
    let v2: Vec<String> = Vec::new();
    
    let a1 = &v1 as &dyn Any;
    let a2 = &v2 as &dyn Any;
    
    println!("{:?}", a1.type_id());
    println!("{:?}", a2.type_id());
}

我们为 Vec 的两个实例获得了不同的类型 ID .这支持了 Vec<i32> 的事实和 Vec<String>是不同的类型。

但是,Rust 中的反射功能是有限的; Any这几乎是我们现在所拥有的。您无法获取有关运行时值类型的更多信息,例如其名称或其成员。为了能够与Any一起工作,您必须将其强制转换(使用 Any::downcast_ref() Any::downcast_mut() 转换为编译时已知的类型。

关于rust - Rust 是否删除泛型类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32546054/

相关文章:

java - 绕过 Java/GWT 中的类型删除

java - 对java中的 `toArray(T[] a)`方法感到困惑

java - Java 中 Class<?> 和 Class<Object> 的区别

rust - 为什么在此迭代中数据被可变借用到并行迭代器的结果上?

rust - 如何在 Rust 中正确实现 Error::cause?

rust - 为什么 no_std crate 可以依赖于使用 std 的 crate?

rust - 如何从使用rust 连接scylladb

c++ - 获取 std::any 的大小

java - Spring 如何在运行时获取有关 "Strongly-typed collection"的通用类型信息?

haxe - 豹纹使用rust