rust 为什么当use std::io::Write在main中时代码可以工作,而当它在lib中时却不能

xuo3flqw  于 2023-01-30  发布在  其他
关注(0)|答案(1)|浏览(141)

我有两个正在使用的文件:main.rs和lib.rs。
main.rs:

use std::io;
use std::io::Write; //My library depends on this line :(

use input_macro_attempt::input;

fn main() {
    let x = input!("Enter a variable: ");

    println!("The variable is: {}", x);

}

lib.rs:

use std::io;
use std::io::Write; //This one is irrelevant?

#[macro_export]
macro_rules! input{
    ($a:expr) =>{
       {
        
        print!("{}", $a);
        std::io::stdout().flush().unwrap();
        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
        }
    };

}

我做过实验,但当我从www.example.com中删除“std::io::Write”main.rs我的代码中断,但为什么?
我不喜欢println!的输出,所以我切换到print!并手动刷新它,以便您可以将输入与消息放在同一行。
示例:输入输入:* 您的意见 *
我把它添加到我的lib.rs中,它没有任何区别,只有当我的main.rs有它时,它才起作用,我有点沮丧,因为在我的库中,它忽略了整个使用术语。

qltillow

qltillow1#

在Rust中,和其他语言一样,宏扩展只是一种文本替换机制,(好吧,Rust也会检查token类型等等,但是对于你的问题,我们可以忽略它)所以你可以把input!("Enter a variable: ")看作是在调用点被宏的内容替换,如果你想使用include,你必须把它包含在宏本身中,而不是包含在定义它的模块中。

#[macro_export]
macro_rules! input {
    ($a:expr) => {{
        use ::std::io::Write;

        print!("{}", $a);
        ::std::io::stdout().flush().unwrap();
        let mut input = String::new();
        ::std::io::stdin().read_line(&mut input).unwrap();
        input
    }};

    (_) => {{
        use ::std::io::Write;

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

        input
    }};
}

我在use和其他std元素前面使用::,以保证不会意外地包含调用点的子模块std

相关问题