Может ли макрос Rust установить переменную и вернуть значение одновременно? - PullRequest
0 голосов
/ 07 мая 2018

Я хочу создать макрос, который будет принимать в качестве параметров ($var:ident, $val:expr). Макрос должен установить для переменной $var значение $val, клонировать ее и вернуть клон. Это моя попытка:

macro_rules! my_macro {
    ($var:ident, $val:expr) => {{
        let $var = $val;
        $var.clone()
    }}
}

fn main() {
    println!("{}", my_macro!(x, 5));
    println!("{}", x);
}

Это не работает, потому что оператор let находится внутри блока. Если я попытаюсь решить проблему, изменив {{ на {, произойдет синтаксическая ошибка. Есть ли способ решить эту проблему?

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

Это невозможно, потому что в Rust есть гигиенические макросы , как описано здесь .

Макро гигиена в настоящее время не может быть отключена , но может стать возможным в Макросах 2.0 :

[] Реализовать «гигиенический сгиб», когда пользователи хотят, чтобы имя из макроса def стало «escape».

0 голосов
/ 07 мая 2018

номер

Макросы не волшебны, они просто расширяются до одного выражения / утверждения / элемента, которые вы могли бы написать сами. Невозможно написать объявление переменной, которая «выходит за пределы» области, в которой она определена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...