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
相关产品推荐
相关产品推荐

