Ako unos korisnika nije jedna riječ ili broj, trebat će ga unijeti podjela ili se pretvorio u popis nizova ili brojeva.
Primjerice, ako program zatraži vaše puno ime, uključujući i srednju početnu, prvo će ga morati podijeliti u tri zasebna žice prije nego što može raditi s vašim pojedincem, srednjim i prezimenom. To se postiže korištenjem Gudački # Split metoda.
Kako djeluje string # split
U svom najosnovnijem obliku, Gudački # Split uzima jedan argument: razdjelnik polja kao niz. Ovaj razdjelnik bit će uklonjen s izlaza i vratit će se niz nizova podijeljenih na razdjelnik.
Dakle, u sljedećem primjeru, pod pretpostavkom da korisnik ispravno unese svoje ime, trebali biste dobiti troje element red od raskola.
#! / usr / bin / env rubin
print "Koje je tvoje puno ime? "
full_name = get.chomp
ime = puno ime.split ('')
stavlja "Vaše ime je # {name.first}"
stavlja "Vaše prezime # {name.last}"
Ako pokrenemo ovaj program i unesemo ime, dobit ćemo neke očekivane rezultate. Također, imajte na umu da ime prvo
i name.last su slučajnosti. Ime varijabla će biti an red, i ta dva poziva poziva bit će jednaka Naziv [0] i naziv [1] odnosno.$ rubin split.rb
Koje je tvoje puno ime? Michael C. Morin
Vaše ime je Michael
Vaše prezime je Morin
Međutim, Gudački # Split je malo pametniji nego što biste mislili. Ako je argument za Gudački # Split je niz, on to zaista koristi kao razgraničnik, ali ako je argument niz s jednim razmakom (kao što smo koristili), onda zaključuje da želite podijeliti bilo koju količinu bijelog prostora i da također želite ukloniti bilo koji vodeći prostor.
Dakle, ako bismo mu trebali dati malo neispravno stanje poput
Michael C. Morin
(s dodatnim razmacima), zatim Gudački # Split ipak bi učinio ono što se očekuje. Međutim, to je jedini poseban slučaj kad prođete Niz kao prvi argument. Razdjelnici redovite ekspresije
Kao prvi argument možete prenijeti i regularni izraz. Ovdje, Gudački # Split postaje malo fleksibilniji. Također možemo učiniti i malo pametnijim kod za dijeljenje imena.
Ne želimo razdoblje na kraju srednjeg početnog. Znamo da je to srednji inicijal, a baza podataka ne želi razdoblje pa ga možemo ukloniti dok razdvajamo. Kada Gudački # Split odgovara regularnom izrazu, to čini istu stvar kao da se upravo podudarao s razdjelnikom niza: izvlači ga iz ispisa i u njemu ga dijeli.
Dakle, možemo malo razviti svoj primjer:
$ mačka split.rb
#! / usr / bin / env rubin
print "Koje je tvoje puno ime? "
full_name = get.chomp
ime = puno ime.split (/ \.? \ s + /)
stavlja "Vaše ime je # {name.first}"
stavlja "Vaš srednji inicijal je # {name [1]}"
stavlja "Vaše prezime # {name.last}"
Zadani razdvajač zapisa
Rubin nije zaista velik na "posebnim varijablama" koje možete naći na jezicima poput Perla, ali Gudački # Split koristi li ono što trebate biti svjesni. Ovo je zadana varijabla za razdvajanje zapisa, također poznata kao $;.
To je globalno, nešto što ne vidite često u Rubyju, pa ako ga promijenite, moglo bi utjecati na ostale dijelove koda - samo budite sigurni da ćete ga vratiti kada završite.
Međutim, sve što čini ova varijabla djeluje kao zadana vrijednost za prvi argument Gudački # Split. Čini se da je ova varijabla prema zadanim postavkama postavljena na nula. Međutim, ako Gudački # SplitPrvi argument je nula, zamijenit će ga jednim svemirskim nizom.
Razdjelnici nulte duljine
Ako je razlučivač prešao na Gudački # Split tada je niz nulte duljine ili regularni izraz Gudački # Split djelovat će malo drugačije. To će ukloniti ništa iz izvornog niza i podijeliti na svaki znak. To u osnovi pretvara niz u niz jednakih duljina koji sadrži samo nizove s jednim znakom, po jedan za svaki znak u nizu.
Ovo može biti korisno za ponavljanje niza i korišteno je u pre -9.9.x i pre-1.8.7 (koji podržavaju broj značajki od 1.9.x) za ponavljanje znakova u nizu bez brige o raskidu multi-byte Unicode znakovi. Međutim, ako stvarno želite napraviti ponoviti niz, a koristite 1.8.7 ili 1.9.x, vjerojatno biste trebali koristiti Gudački # each_char umjesto toga.
#! / usr / bin / env rubin
str = "Pretvorila me u newt!"
str.split (''). svaki do | c |
stavlja c
kraj
Ograničavanje duljine vraćenog niza
Pa, natrag na naš primjer raščlanjivanja imena, što ako netko ima razmak u prezimenu? Na primjer, nizozemska prezimena često mogu započeti s "van" (što znači "od" ili "od").
Mi stvarno želimo samo 3-element red, pa možemo koristiti drugi argument za Gudački # Split koje smo do sada ignorirali. Očekuje se da će drugi argument biti a Fixnum. Ako je ovaj argument pozitivan, u većini slučajeva bit će ispunjeno mnogo elemenata. Pa bi u našem slučaju htjeli podnijeti 3 za ovaj argument.
#! / usr / bin / env rubin
print "Koje je tvoje puno ime? "
full_name = get.chomp
ime = puno ime.split (/ \.? \ s + /, 3)
stavlja "Vaše ime je # {name.first}"
stavlja "Vaš srednji inicijal je # {name [1]}"
stavlja "Vaše prezime # {name.last}"
Ako ovo pokrenemo ponovo i damo mu nizozemsko ime, djelovat će kako se očekuje.
$ rubin split.rb
Koje je tvoje puno ime? Vincent Willem van Gogh
Vaše ime je Vincent
Vaš srednji inicijal je Willem
Vaše prezime je van Gogh
Međutim, ako je ovaj argument negativan (bilo koji negativan broj), tada neće biti ograničenje broja elementi u izlaznom polju i bilo koji krajnji razgraničitelji pojavit će se kao žice nulte duljine na kraju polje.
To je prikazano u ovom IRB isječku:
: 001> "ovo je, je, test" .split (',', -1)
=> ["ovo", "je", "a", "test", "", "", "", ""]