是否可以在Vec中存储类型,而不是这些类型的实例?

时间:2016-10-21 15:18:16

标签: generics reflection rust

是否可以以某种形式将不同的Rust类型存储到Vec中,以便我能够在以后获取类型?

我可以存储任何类型的TypeId,但据我所知,我无法使用TypeId返回原始类型。

在Java术语中,我想创建一个[boolean.class, char.class, ...]等等。

2 个答案:

答案 0 :(得分:6)

没有。类型不是运行时构造,在编译期间将被删除。你不能拥有这些类型的集合,因为它们不存在。

大多数情况下,您希望create a heterogeneous collection of objects所有人都遵守某些共享界面(例如,app.listen(app.get('port'), function () { console.log('Server has started! http://localhost:' + app.get('port') + '/'); }); )。

答案 1 :(得分:4)

Integer.class在Java中有用的唯一原因是因为Java实现了 reflection

  • 运行时具有所有现有类型的描述
  • 对于每种类型,它都具有所有属性和方法的描述

因此,虚拟机可以在运行时从空中创建类型的实例

自动,普遍的反思违反了Rust的至少一个核心原则:

  

你不会为你不能使用的东西买单。

所以没有实施。

Rust还有一些的反射:

  • 它有编译时反射,通过插件
  • 它有一些类型信息,通过TypeId

但是,前者不会产生任何内存/性能开销,而后者则按使用付费。

据我所知,目前还没有提出大幅度反思的建议。即使是向下转换现在也被视为库,而不是语言选项(参见query_interface包)。