Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 如何从声明性宏返回新字符串?_String_Rust_Rust Macros_Rust Decl Macros - Fatal编程技术网

String 如何从声明性宏返回新字符串?

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

所以,我在这里,卡车和沙沙声,直到我得到测试4的侧面

它希望我编写一个宏,满足以下代码:

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)
    }
}