Я написал этот уродливый рекурсивный макрос, потому что хотел узнать что-то о макросах.
macro_rules! tuplet {
{ ($y:ident $(, $x:ident)*) = $v:expr } => {
let ($y,$($x),*) = tuplet!($v ; 1 ; ($($x),*) ; ($v[0])); };
{ $v:expr ; $j:expr ; ($y:ident $(, $x:ident)*) ; ($($a:expr),*) } => {
tuplet!($v ; $j+1 ; ($($x),*) ; ($($a),*,$v[$j])) };
{ $v:expr ; $j:expr ;() ; $accu:expr } => { $accu }
}
Я новичок в этом и, вероятно, очень плохо в нем, так что, скорее всего, это лучший способ сделать это. Просто доказательство концепции. Это позволяет писать
v = vec![1,2,3];
tuplet!((a,b,c) = v);
где-то в этом макроопределении вы найдете часть $v[$j]
, которую вы могли бы заменить на $v.nth($j)
, если вы хотите использовать его для итераторов.
Одна проблема - это кортеж - тип. Так что кортеж с 2 элементами отличается от набора из трех элементов. take (2) может быть не лучшей функцией здесь, но вам, вероятно, потребуется специальный макрос, который возвращает соответствующий тип на основе числа, которое вы передаете. –
Какое поведение вы хотите, если вектор содержит менее двух элементов? – Shepmaster
@Shepmaster - отличный вопрос. В этом свете я не могу придумать достаточно хорошую причину, чтобы эта функциональность была возможной. – anderspitman