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

Rust中&dyn Lol转&dyn Any报错及类型计数实现问题

问题:统计切片中动态类型的出现次数

我想要实现一个函数,用于统计切片中实际类型的出现次数,编写的初始代码如下:

struct Struct1;
struct Struct2;

trait Lol {}

impl Lol for Struct1 {}
impl Lol for Struct2 {}

fn countActualTypes<T>(s: &[&dyn Lol]) -> u32 {   
    let mut cnt = 0;        
    s.iter().for_each(|e| {   // (1) e的类型是&&dyn Lol,因此*e是&dyn Lol,看起来没问题
        if (*e as &dyn Any).is::<T>() { // (2)
            cnt += 1;
        }        
    });   
    cnt
}

fn main() {
    let slice = [&Struct1 as &dyn Lol, &Struct2 as &dyn Lol].as_slice();
    assert_eq!(1, countActualTypes::<Struct1>(slice));    
}

代码在(2)处报错:error[E0605]: non-primitive cast: &dyn Lol as `&(dyn Any + 'static)。

我认为报错原因是dyn Any默认的'static生命周期,于是修改函数为:

fn countActualTypes<'a, T>(s: &[&'a dyn Lol]) -> u32 {   
    let mut cnt = 0;        
    s.iter().for_each(|e| {   // e的类型是&&dyn Lol (1)
        if (*e as &'a dyn Any).is::<T>() {
            cnt += 1;
        }        
    });   
    cnt
}

但仍然报相同错误。

接着尝试以下写法:

fn countActualTypes<'a, T>(s: &[&(dyn Lol + 'a)]) -> u32 {   
    let mut cnt = 0;        
    s.iter().for_each(|e| {   // e的类型是&&dyn Lol (1)
        if (*e as &(dyn Any + 'a)).is::<T>() {
            cnt += 1;
        }        
    });   
    cnt
}

报错:error[E0605]: non-primitive cast: &dyn Lol as &(dyn Any + 'a)

问题

问题1:&(dyn Lol + 'a) 和 &'a dyn Lol 是否有区别?

问题2:如何让这段代码正常工作?

最终实现(更新)

感谢解答,我最终实现了如下代码:

trait Lol: Any {}

fn countActualTypes<T: 'static>(s: &[&dyn Lol]) -> u32 {   
    let mut cnt = 0;        
    s.iter().for_each(|e| {       
        if (*e).type_id() == TypeId::of::<T>() {
            cnt += 1;
        }          
    });   
    cnt
}

内容的提问来源于stack exchange,提问作者user3070377

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 05:55:29