一键导入
rust-macros
Rust 宏技能。提供 Rust 宏的完整参考,包括声明宏、过程宏、宏规则等。TRIGGER when: 用户编写宏、使用宏、调试宏、或需要了解宏系统时触发。SKIP: 非宏相关的 Rust 开发。
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Rust 宏技能。提供 Rust 宏的完整参考,包括声明宏、过程宏、宏规则等。TRIGGER when: 用户编写宏、使用宏、调试宏、或需要了解宏系统时触发。SKIP: 非宏相关的 Rust 开发。
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Rust 高级特性技能。提供 Rust 高级特性的完整参考,包括 unsafe Rust、高级 trait、高级类型、宏、FFI 等。TRIGGER when: 用户使用 unsafe 代码、实现高级 trait、使用高级类型、编写宏、或需要了解 Rust 高级特性时触发。SKIP: 基础 Rust 开发。
Rust CLI 工具开发技能。提供使用 Rust 开发命令行工具的完整参考,包括参数解析、错误处理、输出格式化、跨平台支持等。TRIGGER when: 用户开发 Rust CLI 工具、使用 clap/structopt、处理命令行参数、格式化输出、或需要了解 Rust CLI 最佳实践时触发。SKIP: 非 CLI 工具的 Rust 开发。
Rust 版本指南技能。提供 Rust 版本(Edition)的完整参考,包括版本差异、迁移指南、新特性等。TRIGGER when: 用户需要了解 Rust 版本差异、迁移代码到新版本、或需要了解版本新特性时触发。SKIP: 非版本相关的 Rust 开发。
Rust 嵌入式开发技能。提供使用 Rust 进行嵌入式开发的完整参考,包括 no_std 环境、HAL 层、外设驱动、中断处理、实时系统等。TRIGGER when: 用户开发嵌入式 Rust 程序、使用 cortex-m/esp-hal、配置 no_std 环境、处理硬件外设、或需要了解 Rust 嵌入式最佳实践时触发。SKIP: 非嵌入式 Rust 开发。
Rust 练习技能。提供 Rust 练习和学习资源的完整参考,包括 Rustlings、练习题、最佳实践等。TRIGGER when: 用户学习 Rust、需要练习题、或需要了解 Rust 学习资源时触发。SKIP: 非学习相关的 Rust 开发。
Rust 语言核心开发技能。提供 Rust 语言的完整参考,包括所有权、借用、生命周期、泛型、trait、错误处理、并发、异步等核心概念。TRIGGER when: 用户编写 Rust 代码、询问 Rust 语法、需要 Rust 代码示例、调试 Rust 程序、或需要了解 Rust 语言特性时触发。SKIP: 非 Rust 语言的开发任务。
| name | rust-macros |
| description | Rust 宏技能。提供 Rust 宏的完整参考,包括声明宏、过程宏、宏规则等。TRIGGER when: 用户编写宏、使用宏、调试宏、或需要了解宏系统时触发。SKIP: 非宏相关的 Rust 开发。 |
本技能提供 Rust 宏的完整参考,包括声明宏、过程宏、宏规则等。
当用户执行以下操作时触发此技能:
以下情况不触发此技能:
macro_rules! say_hello {
// 无参数
() => {
println!("Hello!");
};
}
// 调用
say_hello!();
macro_rules! create_function {
// 匹配标识符
($func_name:ident) => {
fn $func_name() {
println!("函数 {} 被调用", stringify!($func_name));
}
};
}
create_function!(foo);
create_function!(bar);
fn main() {
foo();
bar();
}
macro_rules! calculate {
// 匹配表达式
($a:expr, $b:expr, $op:expr) => {
match $op {
"+" => $a + $b,
"-" => $a - $b,
"*" => $a * $b,
"/" => $a / $b,
_ => panic!("未知运算符"),
}
};
}
fn main() {
let result = calculate!(10, 5, "+");
println!("10 + 5 = {}", result);
}
macro_rules! vec {
// 匹配重复的表达式
($($x:expr),*) => {
{
let mut temp_vec = Vec::new();
$(
temp_vec.push($x);
)*
temp_vec
}
};
// 匹配重复的表达式,带分隔符
($($x:expr),+ $(,)?) => {
{
let mut temp_vec = Vec::new();
$(
temp_vec.push($x);
)*
temp_vec
}
};
}
fn main() {
let v = vec![1, 2, 3];
let v = vec![1, 2, 3,]; // 尾逗号
}
macro_rules! my_macro {
// 分支 1:无参数
() => {
println!("无参数");
};
// 分支 2:一个参数
($x:expr) => {
println!("一个参数: {}", $x);
};
// 分支 3:两个参数
($x:expr, $y:expr) => {
println!("两个参数: {} 和 {}", $x, $y);
};
// 分支 4:重复参数
($($x:expr),+) => {
$(
println!("参数: {}", $x);
)+
};
}
fn main() {
my_macro!();
my_macro!(42);
my_macro!(1, 2);
my_macro!(1, 2, 3, 4, 5);
}
use proc_macro::TokenStream;
use quote::quote;
use syn::{parse_macro_input, DeriveInput};
#[proc_macro_derive(MyMacro)]
pub fn my_macro_derive(input: TokenStream) -> TokenStream {
let input = parse_macro_input!(input as DeriveInput);
let name = &input.ident;
let expanded = quote! {
impl MyTrait for #name {
fn my_method(&self) -> String {
format!("{} 实现了 MyTrait", stringify!(#name))
}
}
};
TokenStream::from(expanded)
}
use proc_macro::TokenStream;
use quote::quote;
use syn::{parse_macro_input, ItemFn};
#[proc_macro_attribute]
pub fn my_attribute(args: TokenStream, input: TokenStream) -> TokenStream {
let input = parse_macro_input!(input as ItemFn);
let name = &input.sig.ident;
let block = &input.block;
let expanded = quote! {
fn #name() {
println!("函数 {} 被调用", stringify!(#name));
#block
}
};
TokenStream::from(expanded)
}
use proc_macro::TokenStream;
use quote::quote;
use syn::{parse_macro_input, LitStr};
#[proc_macro]
pub fn my_macro(input: TokenStream) -> TokenStream {
let input = parse_macro_input!(input as LitStr);
let value = input.value();
let expanded = quote! {
println!("宏输出: {}", #value);
};
TokenStream::from(expanded)
}
macro_rules! matchers {
// 匹配标识符
($i:ident) => { stringify!($i) };
// 匹配表达式
($e:expr) => { $e };
// 匹配类型
($t:ty) => { stringify!($t) };
// 匹配字面量
($l:literal) => { $l };
// 匹配模式
($p:pat) => { stringify!($p) };
// 匹配语句
($s:stmt) => { stringify!($s) };
// 匹配块
($b:block) => { stringify!($b) };
// 匹配项
($i:item) => { stringify!($i) };
// 匹配元
($m:meta) => { stringify!($m) };
// 匹配生命期
($l:lifetime) => { stringify!($l) };
// 匹配 tt
($t:tt) => { stringify!($t) };
}
macro_rules! repeat {
// * 零次或多次
($($x:expr),*) => {
vec![$($x),*]
};
// + 一次或多次
($($x:expr),+) => {
vec![$($x),+]
};
// ? 零次或一次
($x:expr $(, $y:expr)?) => {
($x, $($y)?)
};
}
#[macro_export]
macro_rules! my_macro {
() => {
println!("导出的宏");
};
}
// println!
println!("Hello, {}!", "world");
println!("{:?}", vec![1, 2, 3]);
println!("{:#?}", vec![1, 2, 3]);
// eprintln!
eprintln!("错误: {}", "文件未找到");
// dbg!
let x = 5;
let y = dbg!(x * 2); // 打印表达式和值
// todo!
fn not_implemented() -> i32 {
todo!("这个函数还没实现");
}
// unimplemented!
fn not_implemented() -> i32 {
unimplemented!();
}
// unreachable!
fn unreachable() {
unreachable!("不应该到达这里");
}
// panic!
panic!("发生错误");
panic!("错误: {}", "文件未找到");
// stringify!
let s = stringify!(hello world);
// concat!
let s = concat!("Hello", ", ", "world!",);
// stringify!
let name = stringify!(my_function);
// file!()
println!("文件: {}", file!());
// line!()
println!("行号: {}", line!());
// column!()
println!("列号: {}", column!());
// module_path!()
println!("模块路径: {}", module_path!());
// cfg!
if cfg!(target_os = "linux") {
println!("Linux 平台");
}
// env!
let version = env!("CARGO_PKG_VERSION");
// option_env!
let debug = option_env!("DEBUG");
// include_str!
let content = include_str!("data.txt");
// include_bytes!
let data = include_bytes!("data.bin");
// compile_error!
#[cfg(not(target_os = "linux"))]
compile_error!("这个库只支持 Linux");
#[macro_export]cargo expand 查看宏展开# 安装
cargo install cargo-expand
# 展开宏
cargo expand
# 展开特定模块
cargo expand my_module
# 查看宏展开
RUSTFLAGS=-Zmacro-backtrace cargo build
# 打印宏展开
#[macro_export]
macro_rules! debug_macro {
($($tt:tt)*) => {
eprintln!("宏输入: {}", stringify!($($tt)*));
$($tt)*
};
}