Ho scritto questa brutta macro ricorsiva, perché volevo imparare qualcosa sulle macro.
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 }
}
Sono nuovo di questo e probabilmente molto brutto, quindi c'è molto probabilmente un modo migliore per farlo. Solo una prova di concetto. Esso consente di scrivere
v = vec![1,2,3];
tuplet!((a,b,c) = v);
qualche parte in quella definizione di macro si trova la parte $v[$j]
, che è possibile sostituire con $v.nth($j)
se si desidera utilizzarlo per iteratori.
fonte
2017-05-14 19:02:56
Un problema è che la tupla è di tipo. Quindi tupla con 2 elementi è un tipo distinto dalla tupla di 3 elementi. Take (2) potrebbe non funzionare al meglio qui, ma probabilmente dovresti richiedere una macro speciale che restituisca il tipo appropriato in base al numero che passi. –
Quale comportamento vuoi quando il vettore contiene meno di due elementi? – Shepmaster
@Shepmaster è un'ottima domanda. In quella luce non riesco a pensare a una ragione sufficiente per rendere possibile questa funzionalità. – anderspitman