如何实现Rust中按元素类型过滤的函数?对比Dart实现
在Rust中实现类似Dart
whereType<A> 的类型过滤函数 当然可以实现,Rust需要借助std::any::Any trait提供的运行时类型检查能力来完成这个功能,具体实现如下:
use std::any::Any; trait X: Any {} struct A; struct B; impl X for A {} impl X for B {} /// 仅保留类型为A的元素 fn filter(list: Vec<Box<dyn X>>) -> Vec<Box<A>> { list.into_iter() .filter_map(|boxed_x| { // 尝试将Box<dyn X>向下转换为Box<A>,转换失败则过滤掉该元素 boxed_x.downcast::<A>().ok() }) .collect() }
关键说明:
- 依赖
Anytrait:Rust的trait object会擦除具体类型信息,要恢复类型必须借助Anytrait,它提供了downcast方法用于运行时类型转换,因此需要让trait X继承Any。 downcast的行为:downcast::<A>()尝试将Box<dyn X>转换为Box<A>,成功返回Ok(Box<A>),失败返回Err(Box<dyn X>);filter_map会自动过滤Err结果,只保留转换成功的元素。- 生命周期约束:
Anytrait要求实现类型满足'static生命周期,确保类型在程序运行期间能被正确识别,这是Rust类型安全的要求。
和Dart实现的差异:
Dart的whereType<A>是语言原生支持的语法糖,直接依赖语言的动态类型特性;而Rust作为静态强类型语言,必须通过显式的运行时类型检查来实现类似功能,这是两者类型系统设计差异导致的。
内容的提问来源于stack exchange,提问作者Lomírus
相关产品推荐
相关产品推荐

