Ho appena scoperto il seguente comportamento strano con String#split
:Perché split ('') sta cercando di essere (troppo) intelligente?
"a\tb c\nd".split
=> ["a", "b", "c", "d"]
"a\tb c\nd".split(' ')
=> ["a", "b", "c", "d"]
"a\tb c\nd".split(/ /)
=> ["a\tb", "c\nd"]
The source (string.c da 2.0.0) è lunga più di 200 linee e contiene un passaggio come questo:
/* L 5909 */
else if (rb_enc_asciicompat(enc2) == 1) {
if (RSTRING_LEN(spat) == 1 && RSTRING_PTR(spat)[0] == ' '){
split_type = awk;
}
}
Più tardi, nel codice per il tipo di split awk
, l'argomento effettivo non viene nemmeno più utilizzato e fa lo stesso di un semplice split
.
- Qualcun altro ritiene che questo sia in qualche modo rotto?
- Ci sono dei buoni motivi?
- La "magia" come quella si verifica più spesso di quanto la maggior parte della gente possa pensare in Ruby?
Perché è qualcosa che è documentato essere "troppo intelligente"? È un comportamento predefinito previsto che è possibile ignorare se si sceglie di passarlo a un modello alternativo da utilizzare per suddividere il testo. –
Con troppo intelligente intendo dire rubino che voglio dividere a tutti i caratteri degli spazi bianchi, dove sto letteralmente dicendo di dividere in spazi. –
Voterò per chiudere questa domanda poiché mi sto rendendo conto che probabilmente non c'è una risposta generale e soddisfacente a questa domanda. Grazie per tutte le vostre risposte e commenti! –