如何在rust中创建匹配宏?
我正在尝试完成沙沙声练习中的第4个小测验: //编写一个通过测验的宏!这次没有提示,你可以做到如何在rust中创建匹配宏?,rust,rust-macros,Rust,Rust Macros,我正在尝试完成沙沙声练习中的第4个小测验: //编写一个通过测验的宏!这次没有提示,你可以做到 #[cfg(test)] mod tests { use super::*; #[test] fn test_my_macro_world() { assert_eq!(my_macro!("world!"), "Hello world!"); } #[test] fn test_my_macr
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_my_macro_world() {
assert_eq!(my_macro!("world!"), "Hello world!");
}
#[test]
fn test_my_macro_goodbye() {
assert_eq!(my_macro!("goodbye!"), "Hello goodbye!");
}
}
我的宏如下所示:
#[macro_export]
macro_rules! my_macro {
(($val:expr), "world!") => {
println!("Hello world!");
};
(($val:expr), "goodbye!") => {
println!("Hello goodbye!");
};
}
这是在Rust语言文档的声明性宏部分之后形成的。我得到以下错误:
assert_eq!(my_macro!("world!"), "Hello world!");
| ^^^^^^^^^^ no rules expected this token in macro call
assert_eq!(my_macro!("goodbye!"), "Hello goodbye!");
| ^^^^^^^^^^ no rules expected this token in macro call
我找不到解决这个问题的方法来编译它。救命啊 在头脑清醒并彻底检查错误消息后,我发现了它。以下是解决方案:
#[macro_export]
macro_rules! my_macro {
($("world!"),*) => {
"Hello world!"
};
($("goodbye!"),*) => {
"Hello goodbye!"
};
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_my_macro_world() {
assert_eq!(my_macro!("world!"), "Hello world!");
}
#[test]
fn test_my_macro_goodbye() {
assert_eq!(my_macro!("goodbye!"), "Hello goodbye!");
}
}
我把它弄得太复杂了。在头脑清醒并彻底检查了错误消息后,我发现了它。以下是解决方案:
#[macro_export]
macro_rules! my_macro {
($("world!"),*) => {
"Hello world!"
};
($("goodbye!"),*) => {
"Hello goodbye!"
};
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_my_macro_world() {
assert_eq!(my_macro!("world!"), "Hello world!");
}
#[test]
fn test_my_macro_goodbye() {
assert_eq!(my_macro!("goodbye!"), "Hello goodbye!");
}
}
我把它弄得太复杂了。我认为这个练习的目的是找到一种方法,通过使用宏,我们可以得到字符串“Hello where”。我也是Rust的新手,但我可以这样做:
#[macro_use]
macro_rules! my_macro {
($val:expr) => {
format!("Hello {}",$val);
}
}
我在等待反馈 我认为这个练习的目的是找到一种方法,通过使用宏,我们可以得到字符串“Hello where”。我也是Rust的新手,但我可以这样做:
#[macro_use]
macro_rules! my_macro {
($val:expr) => {
format!("Hello {}",$val);
}
}
我在等待反馈 您不应该使用
格式!()
在@Max的答案中这样的宏中,应该使用concat而是code>,因为它在编译时生成字符串片段,而不是在运行时格式化:
macro\u规则!my_宏{
($val:tt)=>{
concat!(“你好,$val”);
}
}
您不应该使用格式!()
在@Max的答案中这样的宏中,应该使用concat而是code>,因为它在编译时生成字符串片段,而不是在运行时格式化:
macro\u规则!my_宏{
($val:tt)=>{
concat!(“你好,$val”);
}
}
试着手工编写宏的扩展,看看是否对您有意义。宏中的($val:expr),
是什么?它没有使用,您希望它与什么匹配?尝试手动编写宏的扩展,看看它是否对您有意义。宏中的($val:expr),
是什么?它没有被使用,你希望它能匹配什么?这样它可以工作,但也有点太复杂了。提示:1)$(something),*
构造在您的案例中起什么作用?2) 分支之间有什么区别?3) 你知道吗?这种方法很有效,但也有点太复杂了。提示:1)$(something),*
构造在您的案例中起什么作用?2) 分支之间有什么区别?3) 你知道吗?