スキル一覧に戻る
huiali

rust-macro

by huiali

An AI expert capability layer for Rust engineering practices, centered on modular skill orchestration and collaborative execution chains. It turns Rust’s core knowledge structures into callable reasoning and decision units, enabling diagnosis, design, and optimization in complex real-world scenarios.

1🍴 1📅 2026年1月25日
GitHubで見るManusで実行

SKILL.md


name: rust-macro description: "宏与过程元编程专家。处理 macro_rules!, derive, proc-macro, 泛型宏、编译时计算等问题。触发词:macro, derive, proc-macro, macro_rules, 宏, 过程宏, 编译时计算" globs: ["**/*.rs"]

宏与过程元编程

核心问题

如何减少重复代码?什么时候用宏,什么时候用泛型?

宏是编译时代码生成,泛型是运行时多态。


宏 vs 泛型

维度泛型
灵活性代码转换类型抽象
编译开销增量编译友好单态化开销
错误信息可能难懂清晰
调试调试宏展开代码直接调试
使用场景减少样板通用算法

declarative macros (macro_rules!)

基本结构

macro_rules! my_vec {
    () => {
        Vec::new()
    };
    ($($elem:expr),*) => {
        vec![$($elem),*]
    };
    ($elem:expr; $n:expr) => {
        vec![$elem; $n]
    };
}

重复模式

标记含义
$()匹配零个或多个
$($x),*以逗号分隔
$($x),+至少一个
$x:ty类型匹配
$x:expr表达式匹配
$x:pat模式匹配

派生宏 (derive macro)

实现简单 derive

use proc_macro::TokenStream;
#[proc_macro_derive(MyDerive)]
pub fn my_derive(input: TokenStream) -> TokenStream {
    let input = syn::parse_macro_input!(input as syn::DeriveInput);
    let name = &input.ident;
    
    let expanded = quote::quote! {
        impl MyDerive for #name {
            fn my_method(&self) -> String {
                format!("Hello from {}", stringify!(#name))
            }
        }
    };
    
    expanded.into()
}

使用

#[derive(MyDerive)]
struct MyStruct {
    field: i32,
}

函数式过程宏

#[proc_macro]
pub fn my_func_macro(input: TokenStream) -> TokenStream {
    // 转换输入
    let tokens = input.into_iter().collect::<Vec<_>>();
    // 生成代码
    quote::quote! { /* ... */ }.into()
}

调试宏

# 查看宏展开结果
cargo expand
cargo expand --test test_name

最佳实践

做法原因
先用泛型泛型更安全、更易调试
宏保持简单复杂宏难维护
文档化宏用户需要理解展开行为
测试展开结果确保正确性
用 cargo expand 调试可视化宏展开

常用 crate

crate用途
syn解析 Rust 代码
quote生成 Rust 代码
proc-macro2Token 处理
derive-more常用 derive 宏

スコア

総合スコア

70/100

リポジトリの品質指標に基づく評価

SKILL.md

SKILL.mdファイルが含まれている

+20
LICENSE

ライセンスが設定されている

+10
説明文

100文字以上の説明がある

+10
人気

GitHub Stars 100以上

0/15
最近の活動

3ヶ月以内に更新がある

0/10
フォーク

10回以上フォークされている

0/5
Issue管理

オープンIssueが50未満

+5
言語

プログラミング言語が設定されている

+5
タグ

1つ以上のタグが設定されている

0/5

レビュー

💬

レビュー機能は近日公開予定です