繁体   English   中英

为什么我的代码在 use std::io::Write 在我的 main 中但在我的 lib 中时不起作用

[英]Why does my code work when use std::io::Write is in my main but not when it's in my lib

提示:本站提供中英文对照查看,鼠标放在中文字句上可显示英文原文。 若本文未解决您的问题,推荐您尝试使用帮您解决。

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

主.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);

}

库.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
        }
    };


}

我已经尝试过,但是当我从 main.rs 中删除使用“std::io::Write”时,我的代码中断了,但为什么呢?

我不喜欢 output 是如何与 println 一起出现的。 所以我切换到打印! 并手动刷新它,以便您可以将输入与消息放在同一行。

示例:输入输入:您的输入

我将它添加到我的lib.rs中,它没有什么区别,它只有在我的main.rs有它时才有效,我有点沮丧,因为在我的 lib 中它忽略了整个使用术语。

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

#[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

问题未解决?试试使用:帮您解决问题。
暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2023 STACKOOM.COM