Ellei käyttäjän syöttämässä muodossa ole yhtä sanaa tai numeroa, sen on oltava jakaa tai muuttui merkkijonojen tai numeroiden luetteloksi.
Esimerkiksi, jos ohjelma kysyy koko nimeäsi, keskimmäinen alkusi mukaan lukien, sen on ensin jaettava kyseinen tulo kolmeen erilliseen jouset ennen kuin se voi toimia henkilö-, etu- ja sukunimesi kanssa. Tämä saavutetaan käyttämällä String # split menetelmä.
Kuinka merkkijono # jako toimii
Alkeisimmassa muodossaan String # split ottaa yhden argumentin: kentänerotin merkkijonona. Tämä erotin poistetaan ulostulosta ja erottelijaan jakautuneet merkkijonojoukot palautetaan.
Joten seuraavassa esimerkissä oletetaan, että käyttäjän syöttäessä kolmen elementin, jos käyttäjän syötetään nimensä oikein ryhmä jaosta.
#! / usr / bin / env ruby
print "Mikä on koko nimesi? "
full_name = saa.chomp
nimi = koko_nimi.jaettu ('')
laittaa "Etunimesi on # {name.first}"
laittaa "Sukunimesi on # {name.last}"
Jos suoritamme tämän ohjelman ja kirjoitamme nimen, saamme odotettuja tuloksia. Huomaa myös tämä
nimi ensin ja nimi viimeiseksi ovat sattumia. nimi muuttuja on ryhmä, ja nämä kaksi menetelmäsoittoa vastaavat nimi [0] ja nimi [1] vastaavasti.$ ruby split.rb
Mikä on koko nimesi? Michael C. Morin
Etunimesi on Michael
Sukunimesi on Morin
Kuitenkin, String # split on vähän älykkäämpi kuin luulisi. Jos argumentti String # split on merkkijono, se todellakin käyttää sitä erottimena, mutta jos argumentti on merkkijono, jossa on yksi välilyönti (kuten käytimme), sitten se päättelee, että haluat jakaa minkä tahansa määrän välilyöntiä ja että haluat myös poistaa mahdollisen välilyönnin.
Joten jos annettaisiin sille jonkin verran epämuodostuneita tietoja, kuten
Michael C. Morin
(lisäväleillä), sitten String # split tekisi silti mitä odotetaan. Se on kuitenkin ainoa erityistapaus, kun ohitat a jono ensimmäisenä argumenttina. Säännöllisen lausekkeen erottimet
Voit myös välittää säännöllisen lausekkeen ensimmäisenä argumenttina. Tässä, String # split tulee hieman joustavammaksi. Voimme myös tehdä pienestä nimimerkkikoodistamme hieman älykkäämmän.
Emme halua ajanjaksoa keskialueen lopussa. Tiedämme, että se on keskimmäinen alku, ja tietokanta ei halua ajanjaksoa sinne, joten voimme poistaa sen jakamisen aikana. Kun String # split vastaa säännöllistä lauseketta, se tekee saman tarkan asian kuin jos se olisi juuri vastannut merkkijonojen erottimeen: se ottaa sen pois lähtöstä ja halkaisee sen siinä vaiheessa.
Joten voimme kehittää esimerkkiämme hiukan:
$ kissa split.rb
#! / usr / bin / env ruby
print "Mikä on koko nimesi? "
full_name = saa.chomp
nimi = koko_nimi.jaettu (/ \.? \ s + /)
laittaa "Etunimesi on # {name.first}"
laittaa "Keskimmäinen alkusi on # {nimi [1]}"
laittaa "Sukunimesi on # {name.last}"
Oletuksena tietueen erotin
Rubiini ei ole oikeasti iso "erikoismuuttujissa", joita saatat löytää kielillä kuten Perl, mutta String # split käyttääkö jotain mitä sinun täytyy olla tietoinen. Tämä on oletuksena tietueen erotinmuuttuja, joka tunnetaan myös nimellä $;.
Se on globaali asia, jota et usein näe Rubyssa, joten jos muutat sitä, se saattaa vaikuttaa koodin muihin osiin - muista vain muuttaa se takaisin, kun olet valmis.
Kaikki tämä muuttuja kuitenkin toimii oletusarvona ensimmäiselle argumentille String # split. Oletuksena tämä muuttuja näyttää olevan asetettu nolla. Kuitenkin, jos String # splitEnsimmäinen argumentti on nolla, se korvaa sen yhdellä välilyönnillä.
Nollapituuserottajat
Jos erotin siirtyi String # split on nollapituinen merkkijono tai säännöllinen lauseke String # split toimii vähän eri tavalla. Se ei poista mitään alkuperäisestä merkkijonosta ja jaa jokaiselle merkille. Tämä muuttaa pohjimmiltaan merkkijonon yhtä pitkiksi ryhmäksi, joka sisältää vain yhden merkin merkkijonot, yksi jokaiselle merkkijonolle.
Tästä voi olla hyötyä merkkijonon iteroinnissa, ja sitä käytettiin edeltävissä 1.9.x ja pre-1.8.7 (mikä ominaisuuksien lukumäärä välillä 1.9.x) iteroida merkkijonossa merkkijonossa huolehtimatta hajoamisesta multi-tavun Unicode-merkit. Jos kuitenkin todella haluat iteroida merkkijonon yli ja käytät 1.8.7 tai 1.9.x, kannattaa todennäköisesti käyttää String # each_char sen sijaan.
#! / usr / bin / env ruby
str = "Hän muutti minut newt: ksi!"
str.split (''). molemmat tekevät | c |
asettaa c
pää
Palautetun taulukon pituuden rajoittaminen
Joten takaisin nimen jäsennysesimerkkiimme, entä jos jollain on sukunimessä välilyönti? Esimerkiksi hollantilaiset sukunimet voivat usein alkaa "van" (tarkoittaen "tai").
Haluamme todella vain 3-elementin ryhmä, joten voimme käyttää toista argumenttia String # split että olemme toistaiseksi sivuuttaneet. Toisen argumentin odotetaan olevan a Fixnum. Jos tämä argumentti on positiivinen, korkeintaan, että joukko elementtejä täytetään taulukossa. Joten meidän tapauksessamme haluamme hyväksyä 3 tälle väitteelle.
#! / usr / bin / env ruby
print "Mikä on koko nimesi? "
full_name = saa.chomp
nimi = koko_nimi.jaettu (/ \.? \ s + /, 3)
laittaa "Etunimesi on # {name.first}"
laittaa "Keskimmäinen alkusi on # {nimi [1]}"
laittaa "Sukunimesi on # {name.last}"
Jos ajamme tämän uudelleen ja annamme sille hollanninkielisen nimen, se toimii odotetusti.
$ ruby split.rb
Mikä on koko nimesi? Vincent Willem van Gogh
Etunimesi on Vincent
Keskimmäinen alkusi on Willem
Sukunimesi on van Gogh
Jos tämä argumentti on kuitenkin negatiivinen (mikä tahansa negatiivinen luku), niin lukumäärälle ei ole mitään rajoituksia elementit lähtöryhmässä ja mahdolliset takarajoittimet näkyvät nollapituisina merkkijonoina array.
Tämä on osoitettu tässä IRB-katkelmassa:
: 001> "tämä on, testi" .split (',', -1)
=> ["tämä", "on", "a", "testi", "", "", "", ""]