بنقرة واحدة
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)*
};
}