Il numero tutorial mostra alcuni esempi di corrispondenza del modello, ad esempio la corrispondenza su un numero intero per emulare un'istruzione switch di tipo c. Il tutorial mostra anche come eseguire la destrutturazione di base su un tipo di tupla e strutture destrutturanti.Corrispondenza del modello di ruggine su un vettore
Sembra che dovrebbe essere possibile eseguire la corrispondenza del modello su un vettore, ma non riesco a trovare la sintassi corretta per esso e non ho trovato alcun esempio.
Per esempio, in Haskell si può facilmente destrutturare un elenco:
foldr :: (a -> b -> b) -> b -> [a] -> b
foldr func initValue [] = initValue
foldr func initValue (x:xs) = func initValue $ foldr initValue func xs
Così, guardando una traduzione approssimativa, sarebbe bello essere in grado di fare:
fn foldr<A, B>(func: fn(A, B) -> B,
initValue: B,
vals: [A]) -> B {
alt vals {
[] { ret initValue; }
_ {
let h = vec::head(vals),
t = vec::tail(vals);
ret foldr(func, func(initValue, h), t);
}
}
}
Note : So che potresti usare una dichiarazione if qui, sto solo usando questo come esempio di pattern matching su un vettore.
questo momento ritorna:
patterns.rs:10:4: 10:5 error: constant contains unimplemented expression type
patterns.rs:10 [] { ret initValue; }
^
error: aborting due to previous errors
C'è un esempio nel tutorial per destrutturazione strutture (definita con { .. }
) e tuple (definiti con (..)
), così sembra che ci dovrebbe essere costruito il supporto anche per i vettori, considerando anche che contengono una sintassi speciale (definita con [ .. ]
).
Sentitevi liberi di correggermi se utilizzo i vettori anche nel modo sbagliato.
Un po 'tangenziale, ma per le chiamate di coda si dovrebbe usare "essere" invece di "ret". –
@ ian-b Interessante, il [tutorial] (http://doc.rust-lang.org/doc/tutorial.html) e [riferimento alla lingua] (http://doc.rust-lang.org/doc/ rug.html) sembrano obsoleti, menzionano 'be' come una parola chiave ma non ne fanno un riferimento al momento – ash