2012-06-27 13 views
5

In Ruby 1.9.3 (e probabilmente versioni precedenti, non sono sicuro), sto cercando di capire perché il metodo di spaccatura # String di Ruby mi sta dando determinati risultati. I risultati che ottengo sembrano contro-intuitivi da quello che mi aspetterei. Ecco un esempio:Stringa di lunghezza zero restituita dalla stringa n. Divisa

"abcabc".split("b") #=> ["a", "ca", "c"] 
"abcabc".split("a") #=> ["", "bc", "bc"] 
"abcabc".split("c") #=> ["ab", "ab"] 

Qui, il primo esempio restituisce esattamente ciò che mi aspetterei.

Ma nel secondo esempio, sono confuso sul motivo per cui #split restituisce una stringa di lunghezza zero come primo valore dell'array restituito. Qual è il ragionamento per questo? Questo è quello che mi aspetterei invece:

"abcabc".split("a") #=> ["bc", "bc"] 

E lungo quella stessa linea, come mai non c'è finale stringa di lunghezza zero restituito nel terzo esempio? Se il secondo esempio restituisce una stringa di lunghezza zero come primo valore, l'ultimo esempio dovrebbe restituire lo stesso del suo ultimo valore.

Mi illumini, cosa mi manca qui ??

EDIT: Guardando più in esso, mi rendo conto perché questo è il comportamento di default e perché il mio pensiero è completamente sbagliato. Se dovessimo passare attraverso un file CSV ad esempio, dividendo su ogni colonna, i nostri dati verrebbero eliminati perché le colonne guida vuote verrebbero ignorate.

Inoltre, è importante notare che questa domanda non è correlata solo a Ruby - Sto imparando che molte altre lingue si comportano nello stesso modo. Stavo semplicemente usando Ruby quando ho saputo di questo.

+0

Non è consigliabile dividere CSV su virgole. Ti darà risultati negativi su qualsiasi stringa quotata con una virgola incorporata. Invece, usa il modulo CSV incorporato di Ruby, che farà la cosa giusta. –

+0

@ the tin man: Capito, stavo solo parlando in generalità. Grazie! – Threeve

risposta

4
"abcabc".split("b") #=> ["a", "ca", "c"] 
"abcabc".split("a") #=> ["", "bc", "bc"] 
"abcabc".split("c") #=> ["ab", "ab"] 

Supponiamo che stiate dividendo su una virgola. Quale comportamento ti aspetti da ",bc,bc".split(',')? Non è diverso con la divisione su "a". Per il terzo esempio, split omette i vuoti finali di default.

+0

Divisione su una virgola, suppongo che mi aspetterei un risultato di '[" bc "," bc "]'. Ma iniziando a pensare a come funzionano i file CSV, ignorando completamente la stringa vuota principale si otterrebbero risultati inaccurati, quindi ora capisco il "perché". – Threeve

5

Il ruby 1.9 documentation dice

Se il parametro limite è omesso, coda campi nulli vengono soppressi.

Quindi, se prendiamo il vostro esempio:

"abcabc".split("a") #=> ["bc", "bc"] 

E includiamo un valore limite:

"abcabc".split("a", -1) #=> ["ab", "ab", ""] 

si ottiene il comportamento previsto.

Problemi correlati