调试rust的宏

部署运行你感兴趣的模型镜像

nightly版本可以用 trace_macros!,具体看这个:
http://stackoverflow.com/questions/30200374/how-do-i-debug-macros

下面是我写的列子:

#![feature(trace_macros)]
trace_macros!(true);

macro_rules! foo{
    ($x:ident,$f:ident)=>{
        match $x {
            3=>{
                $f(100);
            },
            _=>{
            },
        };
    }

}

fn bar(i:i32){
    println!("hello:{:}",i);
}

fn main(){
    let x = 3;
    foo!(x,bar);
}

Play地址:http://is.gd/ENOHWJ

输出结果:

println! { "hello:{:}" , i }
print! { concat ! ( "hello:{:}" , "\n" ) , i }
foo! { x , bar }
hello:100

这个结果并不好,不能看到宏展开的过程

stable版本可以用这个命令:

rustc xxx.rs --pretty expanded -Z unstable-options
macro_rules! foo{
    ($x:ident,$f:ident)=>{
        match $x {
            3=>{
                $f(100);
            },
            _=>{
            },
        };
    }
}

fn bar(i:i32)->i32{
    i + 100
}

fn main(){
    let x = 3;
    foo!(x,bar);

    let v = vec![1,2,3];
}

输出:

#![feature(no_std)]
#![no_std]
#[prelude_import]
use std::prelude::v1::*;
#[macro_use]
extern crate std as std;
fn bar(i: i32) -> i32 { i + 100 }
fn main() {
    let x = 3;
    match x { 3 => { bar(100); } _ => { } };
    let v = <[_]>::into_vec(::std::boxed::Box::new([1, 2, 3]));
}

用这个命令可以看到完整的展开过程,比如
foo!(x,bar);展开成了:match x { 3 => { bar(100); } _ => { } }; 这个看着就很直观了
let v = vec![1,2,3];展开成:let v = <[_]>::into_vec(::std::boxed::Box::new([1, 2, 3]));

目前不知道怎么用cargo build 展开,所以单独新建了一个rs文件看宏展开

您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

03-22
### Rust 的使用教程与常见问题解决方案 #### 什么是 Rust Rust 中的是一种元编程工具,允许开发者编写生成代码的代码。它们可以显著提高生产力并减少重复工作量。然而,由于其复杂性和灵活性,初学者常常会遇到一些挑战。 --- #### 如何安装和配置 Rust 开发环境 要开始学习 Rust ,首先需要确保已正确安装 Rust 编译器及其相关工具链。可以通过运行以下命令来完成安装: ```bash curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh ``` 这一步骤将下载并设置 `rustc` 和 `cargo` 工具链[^1]。完成后,验证安装是否成功: ```bash rustc --version cargo --version ``` 如果显示版本号,则说明安装成功。 --- #### Rust 的基础概念 Rust 提供了几种类型的: - **声明性(Declarative macros)**:也称为 `macro_rules!` ,用于模式匹配和替换。 - **属性(Attribute-like macros)**:通过 `[attribute]` 形式附加到结构体、枚举或其他项上。 - **函数样式的(Function-like macros)**:类似于普通函数调用的形式。 以下是简单的 `macro_rules!` 示例: ```rust #[macro_export] macro_rules! greet { ($name:expr) => { println!("Hello, {}!", $name); }; } fn main() { greet!("World"); // 输出: Hello, World! } ``` 上述代码展示了如何创建一个接受单个表达式作为输入的简单[^3]。 --- #### 处理依赖冲突问题 当使用第三方库(如 `SmartDefault`)时,可能会因不同版本之间的不兼容而引发错误。这种情况下,建议采取以下措施之一: 1. 更新项目的 `Cargo.toml` 文件以指定特定版本范围。 2. 如果可能,升级整个项目使用的 Rust 版本至最新稳定版。 3. 查阅官方文档或社区支持资源寻找替代方法[^2]。 例如,在 `Cargo.toml` 中明确指定所需版本: ```toml [dependencies] smartdefault = "0.7" ``` --- #### 学习 Rust 的最佳实践 对于希望深入理解 Rust 机制的学习者,《The Little Book of Rust Macros》是一份宝贵的参考资料。该书不仅涵盖了基本语法,还探讨了许多高级主题,包括但不限于参数传递规则、作用域管理以及调试技巧等[^4]。 此外,推荐阅读官方指南章节关于过程的部分,因为它是现代 Rust 生态中最常用的扩展方式之一。 --- #### 结合 clap 构建 CLI 应用程序 假设目标是利用 Rust 创建功能强大的命令行界面应用程序,则不可避免地需要用到像 `clap` 这样的外部库。下面是一个简短的例子展示如何集成两者: ```rust use clap::{App, Arg}; fn main() { let matches = App::new("MyCLI") .arg(Arg::with_name("input").required(true)) .get_matches(); match matches.value_of("input") { Some(input_value) => println!("Input received: {}", input_value), None => eprintln!("No input provided."), } } ``` 此脚本接收来自用户的输入并通过标准输出返回结果[^5]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值