Domanda
match, text, number = *"foobar 123".match(/([A-z]*) ([0-9]*)/)
So che questo è facendo una sorta di normale confronto ma quello che è il ruolo splat qui e c'è un modo per farlo senza il simbolo in modo che sia meno confusione?
Soluzione
c'è un modo per farlo senza il simbolo in modo che sia meno confusione?
Dal a,b = [c,d]
è la stessa di chiamate a,b = *[c,d]
e splat to_a
sul suo operando quando non è una matrice si può semplicemente chiamare to_a in modo esplicito e non è necessario il simbolo:
match, text, number = "foobar 123".match(/([A-z]*) ([0-9]*)/).to_a
Non so se questo è meno confusione, ma è splatless.
Altri suggerimenti
Il simbolo è decomponendo i risultati regex partite (un MatchData
con tre gruppi: l'intero modello, le lettere ed i numeri) in tre variabili. Così si finisce con:
match = "foobar 123"
text = "foobar"
number = "123"
Senza il simbolo, non ci sarebbe solo uno dei risultati (la MatchData
) in modo di Ruby non saprebbero come assegnare a tre variabili indipendenti.
C'è una buona spiegazione nella documentazione per MatchData :
A causa to_a viene chiamato quando l'espansione * Variabile, c'è una scorciatoia assegnazione utile per estrarre abbinato campi. Questo è leggermente più lento Accedendo ai campi direttamente (come matrice intermedia viene generato).
all,f1,f2,f3 = *(/(.)(.)(\d+)(\d)/.match("THX1138.")) all #=> "HX1138" f1 #=> "H" f2 #=> "X" f3 #=> "113"
String.match restituisce un oggetto MatchData, che contiene tutte le partite della espressione regolare. L'operatore splat divide questo oggetto e restituisce tutte le partite separatamente.
Se si esegue solo
"foobar 123".match(/([A-z]*) ([0-9]*)/)
in IRB, si può vedere l'oggetto MatchData, con le partite raccolti.
MatchData è una variabile speciale, per tutti gli effetti un array (tipo di) quindi in realtà si può fare anche questo:
match, text, number = "foobar 123".match(/([A-z]*) ([0-9]*)/)[0..2]