我有两个正在使用的文件: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
有它时,它才起作用,我有点沮丧,因为在我的库中,它忽略了整个使用术语。
1条答案
按热度按时间qltillow1#
在Rust中,和其他语言一样,宏扩展只是一种文本替换机制,(好吧,Rust也会检查token类型等等,但是对于你的问题,我们可以忽略它)所以你可以把
input!("Enter a variable: ")
看作是在调用点被宏的内容替换,如果你想使用include,你必须把它包含在宏本身中,而不是包含在定义它的模块中。我在
use
和其他std
元素前面使用::
,以保证不会意外地包含调用点的子模块std
。