Индексирование кортежей в макросе
Я пытаюсь индексировать кортеж данных в макросе, который генерирует подпись для реализации черты, но есть некоторые ошибки. Могу ли я индексировать кортеж или нужно другое решение? Взломать с tuple_index
Я нашел в Google, но это не работает для меня.
macro_rules! expr { ($x:expr) => ($x) } // HACK
macro_rules! tuple_index {
($tuple:expr, $idx:tt) => { expr!($tuple.$idx) }
}
macro_rules! gen_packer {
(@step $data: expr, $_idx:expr,) => {};
(@step $data: expr, $idx:expr, $T:ident, $($tail:ident,)*) => {
// out.append(&mut $T::pack(tuple_index!(data,$idx)));
tuple_index!($data, $idx);
gen_packer!(@step $data, $idx + 1, $($tail,)*);
};
($($T:ident),*) => {
impl<$($T,)+> Packer<($($T,)+)> for Iproto
where $($T: Pack<$T>,)+
{
fn pack(self, data: ($($T,)+)) -> Vec<u8> {
let mut out = vec![];
gen_packer!(@step data, 0, $($T,)*);
return out
}
}
}
}
gen_packer!(A);
Ошибки при компиляции:
error: unexpected token: `0`
--> src/lib/iproto.rs:70:29
|
70 | tuple_index!($data, $idx);
| ^^^^
...
99 | gen_packer!(A);
| --------------- in this macro invocation
error: unexpected token: `,`
--> src/lib/iproto.rs:63:46
|
63 | ($tuple:expr, $idx:tt) => { expr!($tuple.$idx) }
| ^
...
99 | gen_packer!(A);
| --------------- in this macro invocation
error: no rules expected the token `0`
--> src/lib/iproto.rs:70:29
|
61 | macro_rules! expr { ($x:expr) => ($x) } // HACK
| ----------------- when calling this macro
...
70 | tuple_index!($data, $idx);
| ^^^^ no rules expected this token in macro call
...
99 | gen_packer!(A);
| --------------- in this macro invocation
error: aborting due to 3 previous errors
2 ответа
Могу ли я индексировать кортеж или нужно другое решение?
№ выражение $idx + 1
например, будет выдавать разные токены 0
, +
, 1
и не существует способа оценить это для одного литерального токена в декларативном макросе.
Я не думаю, что это возможно с декларативными макросами. Однако это простая работа для процедурных макросов.
Вот библиотека, которая поможет с этим конкретным вариантом использования: https://github.com/bkchr/impl-trait-for-tuples