我的 Rust 宏不想接受这个 let 语句

The*_*les 3 syntax macros input rust macro-rules

我一直在尝试制作一个功能类似于Python输入函数的宏。

而不是每次我想要稍微自动化它时都完全编写标准输入,并结合 println!这样我就可以用一块石头杀死两只鸟。

本质上,如果有人传入一个参数,它会打印一个字符串,然后要求输入,如果他们不这样做,它只会要求从终端输入。

#[macro_export]
macro_rules! input {
    ($a:expr) => {
        println!("{}", $a);
        let mut input = String::new();
        std::io::stdin().read_line(&mut input).unwrap();

        return $input
    };

    (_) => {
        let mut input = String::new();
        std::io::stdin().read_line(&mut $input).unwrap();

        return $input
    };
}
Run Code Online (Sandbox Code Playgroud)

我在 let 语句上不断收到错误,只是不知道如何继续,因为我不太了解宏语法。

我发布了整个代码块,因为在第二个匹配表达式上,我试图在没有参数的情况下进行匹配,但我不确定我是否做得正确。

有时错误消息将我带到 github 页面,并且遇到随机错误,所以我只是困惑如何继续进一步

如果有人能帮助我修复 let 语句,我将不胜感激,对于给您带来的任何不便,我深表歉意。

Lag*_*aer 5

#[macro_export]
macro_rules! input {
    ($a:expr) => {{
        println!("{}", $a);
        let mut input = String::new();
        std::io::stdin().read_line(&mut input).unwrap();
        input
    }};

    (_) => {{
        let mut input = String::new();
        std::io::stdin().read_line(&mut $input).unwrap();

        input
    }};
}

fn main() {
    let foo = input!("Blargh");
}
Run Code Online (Sandbox Code Playgroud)

您需要额外的花括号。第一对用于包含宏应扩展的内容。第二对是因为宏应该扩展为代码块

然后我们摆脱掉,return因为宏不是函数。相反,它只是扩展为一些代码,并且代码块的值只是最后一个表达式(不带;)。