Rustlings Course Test4.rs Marcro Тип возврата Возвращает - PullRequest
0 голосов
/ 22 декабря 2019

Я делаю курс Rustlings Rust-lang и работаю над 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 является пустым типом кортежа (т. Е. expected type ()), где мы сравниваем его со статической строкой.

Если параметрыупражнение позволило бы мне изменить код в основной функции, тогда упражнение кажется немного более простым. Однако, согласно инструкции, единственное, что нужно сделать, - это написать макрос, который заставит код скомпилироваться.

Насколько я понимаю, вы не можете явно объявить тип возврата для макроса. Поэтому я не знаю, как поступить.

1 Ответ

0 голосов
/ 22 декабря 2019

Итак, вот рабочий ответ, который я придумал:

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 vs & str, превосходный охват которых можно найти здесь .

Код компилируется без какого-либо изменения функции main () в соответствии с параметрами команды. Я думаю, что еще более элегантным решением было бы написать макрос, который возвращал бы правильный тип, не полагаясь на дополнительную функцию. Предполагая, что это возможно!

...