Macros 宏能否生成其他数据?

Macros 宏能否生成其他数据?,macros,rust,Macros,Rust,宏是否可以生成其他数据?我想实现向量swizzling。矢量有多种组合4。4+2^2+3^3+4^4=291个组合 除了简单的替换,我还没有对宏做过任何事情,所以我想知道是否可以表达类似的东西,或者我需要编译器插件吗?Rust支持3种代码生成方法: 用宏声明的宏 依赖插件的过程宏(不稳定) build.rs 后者是专门支持代码生成/第三方库构建(如C库)的内置程序 在您的案例中,您对该部分特别感兴趣,该部分非常简单(引用文档): 有鉴于此,您可以在构建开始之前自动生成任何.rs文件,而无需遇

宏是否可以生成其他数据?我想实现向量swizzling。矢量有多种组合4。4+2^2+3^3+4^4=291个组合


除了简单的替换,我还没有对宏做过任何事情,所以我想知道是否可以表达类似的东西,或者我需要编译器插件吗?

Rust支持3种代码生成方法:

  • 宏声明的宏
  • 依赖插件的过程宏(不稳定)
  • build.rs
后者是专门支持代码生成/第三方库构建(如C库)的内置程序

在您的案例中,您对该部分特别感兴趣,该部分非常简单(引用文档):


有鉴于此,您可以在构建开始之前自动生成任何
.rs
文件,而无需遇到宏卫生问题或依赖夜间编译器。

“附加数据”是一个非常通用的概念。你真的在问宏是否可以根据宏输入生成任意数量的函数?@Shepmaster是的,我基本上想生成宏输入的排列。答案是。(或)。(或)。如果您同意这是一个副本,请随意将其标记为最有用的。如果你没有,你的问题是解释差异。@Shepmaster:我注意到,没有一个重复提到使用构建脚本(在Rust中,由于集成到构建系统中,它比其他语言更方便)。这可能是一个合理的选择。。。取决于问题的具体情况。
foo!(x, y, z);
// expands to
fn xx(self) -> T {..}
fn xy(self) -> T {..}
...
fn xxx(self) -> T {..}
fn xxy(self) -> T {..}
fn xyz(self) -> T {..}
fn xzx(self) -> T {..}
//and so on
...
// build.rs

use std::env;
use std::fs::File;
use std::io::Write;
use std::path::Path;

fn main() {
    let out_dir = env::var("OUT_DIR").unwrap();
    let dest_path = Path::new(&out_dir).join("hello.rs");
    let mut f = File::create(&dest_path).unwrap();

    f.write_all(b"
        pub fn message() -> &'static str {
            \"Hello, World!\"
        }
    ").unwrap();
}