Я пытаюсь сделать макрос, который я могу назвать следующим образом:Macro соответствие одно выражение после [выр *], путь [тт *] и идент [тт *] ветви
mactest!(some::Path[1, 2, AnotherName[3, 4]])
Какой бы эквивалентно следующему:
make_result(
"some::Path",
1.convert(),
2.convert(),
make_result(
"AnotherName",
3.convert(),
4.convert()
)
)
где convert
некоторые черты, которые будут реализованы для связки типов. (convert
и make_result
имеет тот же тип результата).
Это, насколько я пришел:
// Note: u32 is used as an example result type.
// The real code attempts to create a more complicated object.
trait Foo {
fn convert(&self) -> u32;
}
fn make_result(name: &str, data: Vec<u32>) -> u32 {
// This example ignores name and makes a meaningless result
data.iter().fold(0,|a, &b| a + b)
}
#[macro_export]
macro_rules! mactest {
([ $($inner:expr),* ]) => {{
let mut result = Vec::new();
$(
// Process each element.
result.push(mactest!($inner));
)*
result
}};
($name:path [ $($inner:tt),* ]) => {
make_result(stringify!($name), mactest!([$($inner),*]))
};
($name:ident [ $($inner:tt),* ]) => {
make_result(stringify!($name), mactest!([$($inner),*]))
};
// Process single value. This is never matched?
($x:expr) => {
$x.convert()
};
}
Первый соответствующий филиал макроса должен соответствовать каждому элементу списка либо к path/ident[items]
или одиночному элементу .convert
филиала в конце , Но окончательная ветка никогда не была достигнута, а ржавчина жаловалась error: expected ident, found '1'
, когда отдельные элементы входят в макрос, то есть mactest!(1)
.
Моих рассуждений, как пользователь начинающей ржавчины, что макрос имеет четыре модели: [expr*]
, path[tt*]
, ident[tt*]
и expr
. Когда я передаю что-то вроде 1 в макрос, я не понимаю, почему любой из вышеприведенных шаблонов должен соответствовать/вмешиваться.
Может кто-нибудь объяснить, почему это не работает? Есть ли способ обхода результата?
макрос не работает в обычном случае: https://play.rust-lang.org/?gist=6ce29f2366951025ad4b&version=stable. Он жалуется на «ожидаемый один из'. ','] 'Или оператор, найденный', '" –