You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现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()
}

关键说明:

  • 依赖Any trait:Rust的trait object会擦除具体类型信息,要恢复类型必须借助Any trait,它提供了downcast方法用于运行时类型转换,因此需要让trait X继承Any。
  • downcast的行为:downcast::<A>()尝试将Box<dyn X>转换为Box<A>,成功返回Ok(Box<A>),失败返回Err(Box<dyn X>);filter_map会自动过滤Err结果,只保留转换成功的元素。
  • 生命周期约束:Any trait要求实现类型满足'static生命周期,确保类型在程序运行期间能被正确识别,这是Rust类型安全的要求。

和Dart实现的差异:

Dart的whereType<A>是语言原生支持的语法糖,直接依赖语言的动态类型特性;而Rust作为静态强类型语言,必须通过显式的运行时类型检查来实现类似功能,这是两者类型系统设计差异导致的。

内容的提问来源于stack exchange,提问作者Lomírus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 10:06:10