O ile dane wprowadzone przez użytkownika nie są pojedynczym słowem lub liczbą, będzie to wymagało wprowadzenia rozdzielać lub zamienił się w listę ciągów lub liczb.
Na przykład, jeśli program prosi o pełne imię i nazwisko, w tym środkową inicjał, najpierw musi podzielić dane wejściowe na trzy osobne smyczki zanim będzie mógł współpracować z twoim indywidualnym imieniem, imieniem i nazwiskiem. Osiąga się to za pomocą Ciąg # podzielony metoda.
Jak działa String # split
W najbardziej podstawowej formie Ciąg # podzielony przyjmuje pojedynczy argument: ogranicznik pola jako ciąg. Ogranicznik zostanie usunięty z danych wyjściowych i zwrócona zostanie tablica ciągów podzielonych na ograniczniku.
Tak więc w poniższym przykładzie, zakładając, że użytkownik wprowadzi poprawnie swoją nazwę, powinieneś otrzymać trzyelementy Szyk z podziału.
#! / usr / bin / env ruby
drukuj "Jak masz na imię? "
pełna_nazwa = gets.chomp
name = pełna_nazwa .split ('')
wstawia „Twoje imię to # {name.first}”
wstawia „Twoje nazwisko to # {name.last}”
Jeśli uruchomimy ten program i wprowadzimy nazwę, otrzymamy oczekiwane wyniki. Zauważ też, że najpierw imię i Wymień ostatnie to zbiegi okoliczności. The Nazwa zmienna będzie Szyk, a te dwa wywołania metod będą równoważne z nazwa [0] i nazwa [-1] odpowiednio.
$ ruby split.rb
Jakie jest Twoje pełne imię? Michael C. Morin
Nazywasz się Michael
Nazywasz się Morin
Jednak, Ciąg # podzielony jest nieco mądrzejszy niż myślisz. Jeśli argument do Ciąg # podzielony jest łańcuchem, rzeczywiście używa go jako separatora, ale jeśli argument jest łańcuchem z pojedynczą spacją (tak jak używaliśmy), następnie wnioskuje, że chcesz podzielić na dowolną ilość białych znaków i że chcesz również usunąć wszelkie wiodące białe znaki.
Więc jeśli mielibyśmy podać nieco źle zniekształcone dane wejściowe takie jak
Michael C. Morin
(z dodatkowymi spacjami) Ciąg # podzielony nadal zrobiłby to, czego się spodziewano. Jest to jednak jedyny szczególny przypadek, gdy zdasz Strunowy jako pierwszy argument. Ograniczniki wyrażeń regularnych
Możesz również przekazać wyrażenie regularne jako pierwszy argument. Tutaj, Ciąg # podzielony staje się trochę bardziej elastyczny. Możemy również sprawić, że nasz kod dzielący małe nazwy będzie nieco mądrzejszy.
Nie chcemy kropki na końcu środkowego inicjału. Wiemy, że to środkowy inicjał, a baza danych nie będzie chciała kropki, więc możemy ją usunąć podczas podziału. Gdy Ciąg # podzielony dopasowuje wyrażenie regularne, robi dokładnie to samo, jakby właśnie dopasował ogranicznik łańcucha: wyjmuje go z wyjścia i dzieli w tym momencie.
Możemy więc nieco rozwinąć nasz przykład:
$ cat split.rb
#! / usr / bin / env ruby
drukuj "Jak masz na imię? "
pełna_nazwa = gets.chomp
name = pełna_nazwa.split (/ \.? \ s + /)
wstawia „Twoje imię to # {name.first}”
wstawia „Twój środkowy inicjał to # {name [1]}”
wstawia „Twoje nazwisko to # {name.last}”
Domyślny separator rekordów
Rubin nie jest zbyt duży w „specjalnych zmiennych”, które można znaleźć w językach takich jak Perl, ale Ciąg # podzielony używa takiego, o którym musisz wiedzieć. Jest to domyślna zmienna separatora rekordów, znana również jako $;.
Jest to globalny element, którego często nie widzisz w Rubim, więc jeśli go zmienisz, może to wpłynąć na inne części kodu - pamiętaj, aby po zakończeniu zmienić go z powrotem.
Jednak cała ta zmienna działa jako domyślna wartość dla pierwszego argumentu do Ciąg # podzielony. Domyślnie ta zmienna wydaje się być ustawiona na zero. Jeśli jednak Ciąg # podzielonyPierwszym argumentem jest zero, zastąpi go pojedynczym ciągiem spacji.
Ograniczniki zerowej długości
Jeśli separator przeszedł do Ciąg # podzielony jest zatem ciągiem zerowym lub wyrażeniem regularnym Ciąg # podzielony będzie działać nieco inaczej. Nie usunie niczego z oryginalnego ciągu i podzieli na każdą postać. Zasadniczo zamienia ciąg w tablicę o równej długości zawierającą tylko ciągi jednoznakowe, po jednym dla każdego znaku w ciągu.
Może to być przydatne do iteracji po łańcuchu i było używane w wersjach wcześniejszych niż 1.9.xi 1.8.7 (które miały backport liczba funkcji od 1.9.x) do iteracji znaków w ciągu bez obawy o zerwanie wielobajtowe Znaki Unicode. Jeśli jednak tak naprawdę chcesz iterować po łańcuchu, a używasz 1.8.7 lub 1.9.x, prawdopodobnie powinieneś użyć Ciąg # each_char zamiast.
#! / usr / bin / env ruby
str = "Zmieniła mnie w traszkę!"
str.split (''). każdy do | c |
stawia c
koniec
Ograniczanie długości zwracanej tablicy
Wracając do naszego przykładu analizowania nazw, co jeśli ktoś ma spację w swoim nazwisku? Na przykład holenderskie nazwiska często zaczynają się od „van” (co oznacza „z” lub „z”).
Chcemy tylko 3-elementowy szyk, więc możemy użyć drugiego argumentu do Ciąg # podzielony które dotychczas ignorowaliśmy. Drugi argument ma być Fixnum. Jeśli argument ten jest co najwyżej pozytywny, to wiele elementów zostanie wypełnionych w tablicy. W naszym przypadku chcielibyśmy przekazać 3 dla tego argumentu.
#! / usr / bin / env ruby
drukuj "Jak masz na imię? "
pełna_nazwa = gets.chomp
name = pełna_nazwa.split (/ \.? \ s + /, 3)
wstawia „Twoje imię to # {name.first}”
wstawia „Twój środkowy inicjał to # {name [1]}”
wstawia „Twoje nazwisko to # {name.last}”
Jeśli uruchomimy to ponownie i nadamy mu holenderską nazwę, będzie działać zgodnie z oczekiwaniami.
$ ruby split.rb
Jakie jest Twoje pełne imię? Vincent Willem van Gogh
Nazywasz się Vincent
Twój środkowy inicjał to Willem
Nazywasz się van Gogh
Jeśli jednak ten argument jest ujemny (dowolna liczba ujemna), wówczas nie będzie ograniczenia liczby elementy w tablicy wyjściowej i wszelkie ograniczniki końcowe będą wyświetlane jako łańcuchy o zerowej długości na końcu szyk.
Jest to pokazane w tym fragmencie IRB:
: 001> „this, is, a, test” .split (',', -1)
=> [„this”, „is”, „a”, „test”, „”, „”, „”, „”]