Module 如何在编译时按程序构造属性的值?

Module 如何在编译时按程序构造属性的值?,module,rust,macros,rust-macros,Module,Rust,Macros,Rust Macros,我有许多源文件(001.rs、002.rs、003.rs…),每个文件都有以下内容: // FILE: 001.rs pub const NUM: i64 = 1; // Different number per file 我想用宏加载所有这些值: // FILE: main.rs macro_rules! get_numbers_from_modues { ($start: expr, $end: expr) => {{ let mut numbers = st

我有许多源文件(001.rs、002.rs、003.rs…),每个文件都有以下内容:

// FILE: 001.rs
pub const NUM: i64 = 1; // Different number per file
我想用宏加载所有这些值:

// FILE: main.rs
macro_rules! get_numbers_from_modues {
    ($start: expr, $end: expr) => {{
        let mut numbers = std::vec::Vec::<i64>::with_capacity($end - $start);

        for i in $start..=$end {
            #[path = format!("{:03}.rs", i)] // <= error: unexpected token: `format`
            mod inline_module;
            numbers.push(inline_module::NUM);
        }
        numbers
    }};
}


fn main() {
    let numbers = get_numbers_from_modues!(1, 2);
}
//文件:main.rs
宏规则!从模式中获取号码{
($start:expr,$end:expr)=>{{
让mut numbers=std::vec::vec::::具有_容量($end-$start);
对于$start..=$end中的i{

#[path=format!(“{:03}.rs”,i)]//既然您有所有这些文件,它们大概是生成的。为什么不再生成一个包含所有模块的文件,并定义这个
Vec
?您不能用声明性宏的方式来执行此操作。您正在尝试混合编译时(
mod foo
)和运行时(
for i in…
)构造。这是不允许的。您可以创建一个过程宏来执行此操作。@Shepmaster。将这些宏移动到单独的文件中会有什么好处?我是否仍然需要列出所有这些宏(重复相同)?我在考虑程序宏,并试图从中理解它们。但我似乎无法真正使事情正常进行。我的观点是,您已经有了一些生成文件的工具。请增强该工具,以使用正确的
#[path]生成生锈文件
mod
属性,或者您需要的任何其他属性。文件的数量对我的建议并不重要。我已成功地使用
build.rs
脚本执行类似操作。从一系列数字生成N个Rust文件,然后是一个列出所有文件的模块文件。