String 如何从声明性宏返回新字符串?
所以,我在这里,卡车和沙沙声,直到我得到测试4的侧面 它希望我编写一个宏,满足以下代码:String 如何从声明性宏返回新字符串?,string,rust,rust-macros,rust-decl-macros,String,Rust,Rust Macros,Rust Decl Macros,所以,我在这里,卡车和沙沙声,直到我得到测试4的侧面 它希望我编写一个宏,满足以下代码: fn main() { if my_macro!("world!") != "Hello world!" { panic!("Oh no! Wrong output!"); } } 所以,我写了这个: macro_rules! my_macro { ($val:expr) => { println!("Hello {}", $val);
fn main() {
if my_macro!("world!") != "Hello world!" {
panic!("Oh no! Wrong output!");
}
}
所以,我写了这个:
macro_rules! my_macro {
($val:expr) => {
println!("Hello {}", $val);
}
}
沙沙声把它吐了出来:
错误[E0308]:类型不匹配
-->练习/测试4.rs:15:31
|
15 |如果我的|宏!(“世界!”)!=“你好,世界!”{
|^^^^^^^^^^^^^^^^应为(),已找到引用
|
=注意:应为类型“”()`
找到类型`&'static str`
错误:由于上一个错误而中止
有关此错误的详细信息,请尝试“rustc--explain E0308”。
你知道。我明白了。我明白问题所在,但我不明白如何编写一个满足代码要求的宏。我可以更改我测试的代码,但这不是测试想要我做的。我只是编写一个宏。我被难住了。我也不明白将宏封装在模块中有什么帮助,但e test表示这是对模块和宏的测试。
println!
将打印到stdout
。相反,您只需要格式化字符串并从宏返回它。使用格式!
,然后删除;
,这样它将返回表达式而不是()
:
这就是我一直在寻找的。我遇到的问题是,如果不创建新的变量,我想不出如何使它计算为“Hello world!”,这是你无法做到的。霍尔先生,非常感谢。@AerosolSP没有理由不能创建新的变量。宏的分支只能是一个表达式(即,如果创建变量并对其执行操作,则整个表达式必须用大括号括起来):想想vec!宏是如何工作的。它必须创建一个新的向量:也就是说,使用format!宏仍然是一个更干净的解决方案。我只是想确保你不会认为你不能在宏中创建一个变量。@ObliqueMotion我想混乱可能是因为你不能在你不能创建的宏中创建一个变量hen在宏之外使用。@ObliqueMotion非常感谢您的澄清。我原以为沙沙声课程会更彻底一些,但我开始意识到我应该先看完这本书!
macro_rules! my_macro {
($val:expr) => {
format!("Hello {}", $val)
}
}