Rust宏中如何获取struct泛型类型的关联属性
Rust 宏中提取类型别名内部泛型参数的解决方案
方案1:添加辅助trait暴露关联类型(推荐,改动最小)
这种方案不需要修改现有宏的调用逻辑,仅需要新增一个全局辅助trait,将泛型类型的内部参数绑定为关联类型即可访问:
use std::num::Bounded; // 原泛型结构体 struct Barn<T> { hay: T } // 定义辅助trait,用于暴露内部泛型类型 trait HasInnerType { type Inner: Bounded; } // 为所有Barn<T>实现该trait,将内部泛型T绑定到关联类型Inner impl<T: Bounded> HasInnerType for Barn<T> { type Inner = T; } // 调整后的宏实现 macro_rules! impl_min_hay{ ($barntype:ident) => { impl $barntype { // 直接通过关联类型获取内部泛型作为返回值类型 fn min_hay(&self) -> <$barntype as HasInnerType>::Inner { <$barntype as HasInnerType>::Inner::min_value() } } } } // 类型别名不需要做任何修改 type SmallBarn = Barn<i8>; type BigBarn = Barn<i64>; // 宏调用逻辑完全不变 impl_min_hay!(SmallBarn); impl_min_hay!(BigBarn); fn main() { let barn = SmallBarn { hay: 5 }; println!("{}", barn.min_hay()); // 输出-128 }
该方案完全适配你提到的ChunkedArray场景:只需要先给ChunkedArray<T>实现上述类似的辅助trait,将T绑定为关联类型,之后不管是BooleanChunked还是其他ChunkedArray的类型别名,都可以通过<别名 as 辅助trait>::关联类型名直接拿到内部的泛型参数,直接访问其属性即可。
方案2:修改宏入参显式传递泛型类型
如果不想新增辅助trait,也可以调整宏定义,调用时显式传入内部泛型参数,适合宏调用点较少的场景:
use std::num::Bounded; struct Barn<T> { hay: T } // 宏新增参数接收内部泛型类型 macro_rules! impl_min_hay{ ($barntype:ident, $innertype:ty) => { impl $barntype { fn min_hay(&self) -> $innertype { $innertype::min_value() } } } } type SmallBarn = Barn<i8>; type BigBarn = Barn<i64>; // 调用时额外传入内部泛型类型 impl_min_hay!(SmallBarn, i8); impl_min_hay!(BigBarn, i64); fn main() { let barn = SmallBarn { hay: 5 }; println!("{}", barn.min_hay()); }
内容的提问来源于stack exchange,提问作者road_rash
相关产品推荐
相关产品推荐

