Rustlings Course Test4.rs Marcro Return 类型问题
Rustlings Course Test4.rs Marcro Return Type Issue
我正在做 Rustlings Rust-lang course 并致力于 exercises/test4.rs
这是课程中唯一没有提示的练习。因此,在研究了一段时间之后,我想在这里获得提示!
macro_rules! my_macro {
() => {
println!("Hello!");
};
($val:expr) => {
println!("Hello {}", $val);
}
}
fn main() {
if my_macro!("world!") != "Hello world!" {
panic!("Oh no! Wrong output!");
}
}
当我尝试编译时,出现以下错误:
error[E0308]: mismatched types
--> test4.rs:20:31
|
20 | if my_macro!("world!") != "Hello world!" {
| ^^^^^^^^^^^^^^ expected (), found reference
|
= note: expected type `()`
found type `&'static str`
error: aborting due to previous error
这个问题似乎是基于这样一个事实,即 Rust 宏的默认 return 类型是空元组类型(即 expected type ()
),我们将其与静态字符串进行比较.
如果练习的参数允许我更改主函数中的代码,那么练习似乎会更简单一些。但是,根据说明,唯一要做的就是编写一个使代码编译的宏。
据我了解,您不能为宏显式声明 return 类型。所以我不知道如何进行。
所以这是我想出的有效答案:
fn function_rules(expr:&str)-> String{
let a = "Hello";
let b = expr;
let result = [a, b].join(" ");
return result.to_string();
}
macro_rules! my_macro {
() => {
println!("Hello!");
};
($val:expr) => {
//println!("Hello {}", $val);
function_rules($val)
}
}
fn main() {
if my_macro!("world!") != "Hello world!" {
panic!("Oh no! Wrong output!");
}
}
我解决这个问题的很大一部分是处理 String 与 &str 类型,可以在 here.
中找到很好的介绍
根据指令参数,代码在不以任何方式修改 main() 函数的情况下编译。我认为一个更优雅的解决方案是编写一个返回正确类型的宏,而不依赖于额外的函数。假设这是可能的!
我认为实现可以简单得多:
macro_rules! my_macro {
($val:expr) => {
format!("Hello {}", $val)
}
}
我正在做 Rustlings Rust-lang course 并致力于 exercises/test4.rs
这是课程中唯一没有提示的练习。因此,在研究了一段时间之后,我想在这里获得提示!
macro_rules! my_macro {
() => {
println!("Hello!");
};
($val:expr) => {
println!("Hello {}", $val);
}
}
fn main() {
if my_macro!("world!") != "Hello world!" {
panic!("Oh no! Wrong output!");
}
}
当我尝试编译时,出现以下错误:
error[E0308]: mismatched types
--> test4.rs:20:31
|
20 | if my_macro!("world!") != "Hello world!" {
| ^^^^^^^^^^^^^^ expected (), found reference
|
= note: expected type `()`
found type `&'static str`
error: aborting due to previous error
这个问题似乎是基于这样一个事实,即 Rust 宏的默认 return 类型是空元组类型(即 expected type ()
),我们将其与静态字符串进行比较.
如果练习的参数允许我更改主函数中的代码,那么练习似乎会更简单一些。但是,根据说明,唯一要做的就是编写一个使代码编译的宏。
据我了解,您不能为宏显式声明 return 类型。所以我不知道如何进行。
所以这是我想出的有效答案:
fn function_rules(expr:&str)-> String{
let a = "Hello";
let b = expr;
let result = [a, b].join(" ");
return result.to_string();
}
macro_rules! my_macro {
() => {
println!("Hello!");
};
($val:expr) => {
//println!("Hello {}", $val);
function_rules($val)
}
}
fn main() {
if my_macro!("world!") != "Hello world!" {
panic!("Oh no! Wrong output!");
}
}
我解决这个问题的很大一部分是处理 String 与 &str 类型,可以在 here.
中找到很好的介绍根据指令参数,代码在不以任何方式修改 main() 函数的情况下编译。我认为一个更优雅的解决方案是编写一个返回正确类型的宏,而不依赖于额外的函数。假设这是可能的!
我认为实现可以简单得多:
macro_rules! my_macro {
($val:expr) => {
format!("Hello {}", $val)
}
}