如何在含宏指定长度数组的类型上使用#[derive]?
如何在包含宏指定长度数组的类型上使用#[derive]?
这个问题我之前也踩过坑!核心原因是Rust的#[derive]宏在解析结构体定义时,不会自动展开其他宏调用——它期望数组长度是一个明确的编译期常量或者已被识别的常量标识符,而不是像count!()这样未展开的宏调用。
不过解决起来很简单,只需要把宏的结果赋值给一个命名常量,再用这个常量指定数组长度就行:
macro_rules! count { () => { 1 }; } // 先把宏的结果存到一个常量里 const ARRAY_LENGTH: usize = count!(); #[derive(Debug)] struct MyStruct<T> { // 用常量代替直接的宏调用 field_list: [T; ARRAY_LENGTH], } fn main() { let test = MyStruct { field_list: ["hello"] }; println!("{:?}", test); // 正常输出 MyStruct { field_list: ["hello"] } }
如果你的宏需要根据不同场景生成不同长度也完全没问题——只要宏能展开成有效的usize常量值,把它赋值给常量后就能被derive宏正确识别。
另外还有个小技巧:如果不想额外定义常量,也可以把宏改成直接生成常量表达式的形式(比如macro_rules! count { () => { 1usize }; }),但还是推荐用命名常量,代码可读性会更好。
内容的提问来源于stack exchange,提问作者Zz Tux
相关产品推荐
相关产品推荐

