Types 生锈过程测试4.rs Marcro返回类型问题

Types 生锈过程测试4.rs Marcro返回类型问题,types,rust,rust-macros,Types,Rust,Rust Macros,我正在做Rustlings Rust lang和练习/test4.rs 这是本课程中唯一没有提示的练习。所以在做了一段时间之后,我想在这里得到这个提示 macro_rules! my_macro { () => { println!("Hello!"); }; ($val:expr) => { println!("Hello {}", $val); } } fn main() { if my_macro!("w

我正在做Rustlings Rust lang和
练习/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宏的默认返回类型是空元组类型(即
expected type()
),我们将其与静态字符串进行比较

如果这个练习的参数允许我修改main函数中的代码,那么这个练习看起来会简单一些。然而,根据指令,唯一要做的事情就是编写一个宏来编译代码


据我所知,不能显式声明宏的返回类型。因此,我不知道如何继续进行。

因此,以下是我得出的有效答案:

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!");
    }
}
我认为解决这个问题的很大一部分是处理字符串vs&str类型,这方面的内容非常丰富


根据指令perameters,代码编译时不会以任何方式修改main()函数。我认为更优雅的解决方案是编写一个返回正确类型的宏,而不依赖于额外的函数。假设这是可能的

下面是我得出的有效答案:

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!");
    }
}
我认为解决这个问题的很大一部分是处理字符串vs&str类型,这方面的内容非常丰富


根据指令perameters,代码编译时不会以任何方式修改main()函数。我认为更优雅的解决方案是编写一个返回正确类型的宏,而不依赖于额外的函数。假设这是可能的

我认为实现可能要简单得多:

macro_rules! my_macro {
    ($val:expr) => {
        format!("Hello {}", $val)
    }
}

我认为实施过程可以简单得多:

macro_rules! my_macro {
    ($val:expr) => {
        format!("Hello {}", $val)
    }
}