2013-12-14 16 views
14

Kod '////'.split('/') powoduje []. Oczekiwałem, że będzie to ['', '', '', '', '']. Jeśli jest to funkcja ruby, dlaczego jest tak zaprojektowany?Dlaczego "////'.split('/") produkuje []?

+0

+1 .. za zadawanie dobrego pytania ... :) –

+2

Podczas gdy pytanie jest interesujące, nie jest w najlepszej formie, jaką można by zadać. Twoje pytanie może wprowadzić czytelnika w błąd, że cztery kolejne ukośniki są znaczące dla tego efektu, ale tak nie jest. Otrzymasz taki sam wynik przy krótszej sekwencji cięcia. – sawa

Odpowiedz

3

Ten projekt zapewnia wygodę podczas analizowania ciągów z ogranicznikami wleczonymi. Na przykład:

'1␣2␣3␣␣'.split('␣') będzie teraz dawać ['1', '2', '3'] zamiast ['1', '2', '3', '', ''].

Ta funkcja służy jedynie uproszczeniu obiegu dokumentów.

Jednak nie podoba mi się ta funkcja, ponieważ łamie ona czystość tej metody. Aby osiągnąć powyższy efekt, potrzebujesz tylko rstrip('␣') między '1␣2␣3␣␣' i split('␣').

+8

'('␣')' wygląda uroczo. –

17

Nie można podzielić ciągu ograniczników za pomocą ogranicznika.

Należy przejść granicę jako drugi parametr do funkcji Split, aby osiągnąć to zachowanie

'////'.split('/',-1) 
=> 
["", "", "", "", ""] 

Jeśli parametr limit zostanie pominięta, na końcu pola NULL są tłumione. Jeśli limit jest liczbą dodatnią, co najwyżej liczba pól zostanie zwrócona (jeśli limit wynosi 1, cały ciąg jest zwracany jako jedyny wpis w tablicy). Jeśli jest ujemna, nie ma limitu liczby zwróconych pól, a końcowe pola puste nie są pomijane.

+2

* + 1 * .. Zrobiłem ... :) Ale możesz dodać linie z [doc] (http://www.ruby-doc.org/core-2.0.0/String.html#method-i- split) like - ** Jeśli pominięto parametr ograniczenia, końcowe pola zerowe są pomijane **. Jeśli limit jest liczbą dodatnią, co najwyżej liczba pól zostanie zwrócona (jeśli limit wynosi 1, cały ciąg jest zwracany jako jedyny wpis w tablicy). ** Jeśli wartość jest ujemna, nie ma limitu liczby zwróconych pól, a końcowe pola zerowe nie są pomijane. ** –

+0

dzięki. naprawdę przydatny komentarz. – SergeyKutsko

10

Badanie zachowania metody split wskazuje, że jest wynikiem optymalizacji, po prostu przycina puste elementy tablicy po ostatnim dopasowaniu, ponieważ jest pokazany poniżej:

'////'.split('/') 
=> [] 

'//a//'.split('/') 
=> ["", "", "a"]