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?

È stato utile?

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]

saperne di più sulla variabile speciale MatchData

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top