Właśnie odkryłem następujące dziwne zachowanie z String#split
:Dlaczego split (") próbuje być (zbyt) inteligentny?
"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 od 2.0.0) ma długość ponad 200 linii i zawiera fragment takiego:
/* L 5909 */
else if (rb_enc_asciicompat(enc2) == 1) {
if (RSTRING_LEN(spat) == 1 && RSTRING_PTR(spat)[0] == ' '){
split_type = awk;
}
}
Później w kodzie dla typu podziału awk
, rzeczywisty argument nie jest już używany i robi to samo, co zwykły split
.
- Czy ktoś jeszcze czuje, że jest w jakiś sposób zepsuty?
- Czy istnieją ku temu uzasadnione powody?
- Czy "magia" tak się zdarza częściej niż większość ludzi może myśleć w Ruby?
Dlaczego coś, co zostało udokumentowane, jest "zbyt inteligentne"? Jest to domyślne domyślne zachowanie, które można przesłonić, jeśli wybierzesz, przekazując mu alternatywny wzorzec do podziału tekstu. –
Zbyt inteligentne mam na myśli domysły Ruby, które chcę podzielić na wszystkie znaki odstępu, w których dosłownie mówię, żeby dzieliły się w przestrzeniach. –
Zamierzam głosować, aby zamknąć to pytanie, ponieważ zdaję sobie sprawę, że prawdopodobnie nie ma ogólnej, satysfakcjonującej odpowiedzi na to pytanie. Dziękuję za wszystkie odpowiedzi i komentarze! –