Kuidas jagada keelpillid rubiiniks

click fraud protection

Kui kasutaja sisestus pole üks sõna või number, peab see olema lõhestatud või muudetud stringide või numbrite loendiks.

Näiteks kui programm küsib teie täisnime, sealhulgas keskmist algust, peab ta kõigepealt jagama selle sisendi kolmeks eraldi osaks keelpillid enne kui see saab töötada teie individuaalse ees-, pere- ja perekonnanimega. See saavutatakse kasutades String # split meetod.

Kuidas String # split töötab

Kõige elementaarsemal kujul String # split võtab ühe argumendi: välja eraldaja stringina. See eraldaja eemaldatakse väljundist ja eraldusribale jagatud stringide komplekt tagastatakse.

Seega, eeldades järgmises näites, kui kasutaja sisestab oma nime õigesti, peaksite saama kolme elemendi Massiiv jagunemisest.

#! / usr / bin / env rubiin
print "Mis on su täisnimi? "
täisnimi = saab.chomp
nimi = täisnimi.jaota ('')
paneb kirja "Teie eesnimi on # {name.first}"
paneb kirja "Teie perekonnanimi on # {name.last}"

Kui käivitame selle programmi ja sisestame nime, saame mõned oodatavad tulemused. Samuti pange seda tähele

instagram viewer
nimi.first ja nimi.viimane on kokkusattumused. nimi muutuja on Massiiv, ja need kaks meetodikõnet on samaväärsed nimi [0] ja nimi [-1] vastavalt.

$ ruby ​​split.rb
Mis on teie täisnimi? Michael C. Morin
Teie eesnimi on Michael
Teie perekonnanimi on Morin

Kuid, String # split on natuke nutikam, kui arvata võiks. Kui argument String # split on string, kasutab tõepoolest seda eraldajana, kuid kui argument on ühe tühikuga string (nagu me kasutasime), siis järeldab see, et soovite jaotada suvalisel hulgal tühimikku ja et soovite ka kogu juhtiva tühimiku eemaldada.

Niisiis, kui me annaksime sellele mõne veidi väära sisendi, näiteks

Michael C. Morin

(koos täiendavate tühikutega), siis String # split teeks ikkagi seda, mida oodatakse. Kuid see on ainus erijuhtum, kui möödasite a Keel esimese argumendina. Regulaaravaldise eraldajad

Esimese argumendina saate edastada ka regulaaravaldise. Siin String # split muutub natuke paindlikumaks. Samuti saame oma väikese nime jagamise koodi natuke targemaks muuta.

Me ei soovi perioodi keskmise alguse lõpus. Me teame, et see on keskmine algväärtus ja andmebaas ei soovi sinna mingit perioodi, nii et saame selle lõhenemise ajal eemaldada. Millal String # split sobib tavalise avaldisega, see teeb täpselt samamoodi nagu siis, kui oleks just sobitatud stringi eraldajaga: võtab selle väljundist välja ja lõhestab selle sel hetkel.

Niisiis, saame oma näidet pisut edasi arendada:

$ kass split.rb
#! / usr / bin / env rubiin
print "Mis on su täisnimi? "
täisnimi = saab.chomp
nimi = täisnimi.jaota (/ \.? \ s + /)
paneb kirja "Teie eesnimi on # {name.first}"
paneb kirja "Teie keskmine initsiaal on # {nimi [1]}"
paneb kirja "Teie perekonnanimi on # {name.last}"

Vaikimisi kirje eraldaja

Rubiin pole "erimuutujate" jaoks suur, mida võite leida sellistes keeltes nagu Perl, kuid String # split kasutab seda, millest peate teadma. See on vaikimisi kirje eraldaja muutuja, tuntud ka kui $;.

See on globaalne asi, mida te Ruby'is sageli ei näe, nii et kui muudate seda, võib see mõjutada koodi muid osi - kui see on valmis, muutke see kindlasti tagasi.

Kuid kõik see muutuja toimib esimese argumendi vaikeväärtusena String # split. Vaikimisi tundub, et see muutuja on seatud null. Kui aga String # splitEsimene argument on null, asendab see selle ühe tühiku stringi abil.

Nullpikkuse eraldajad

Kui piiritleja läks edasi String # split on nullpikk string või regulaaravaldis, siis String # split käitub natuke teistmoodi. See eemaldab algsest stringist midagi ja jagab iga tähe. See muudab stringi põhimõtteliselt võrdse pikkusega massiiviks, mis sisaldab ainult ühe märgi stringe, iga stringi iga tähe jaoks üks.

See võib olla kasulik stringi iteratsioonil ja seda kasutati eelsetes 1.9.x ja pre-1.8.7 (mis a funktsioonide arv vahemikus 1.9.x), et korrata stringi tähemärke, muretsemata jaotuse pärast mitmebaidine Unicode'i tegelased. Kui aga see, mida tõesti teha soovite, itereerib üle stringi ja kasutate 1.8.7 või 1.9.x, peaksite tõenäoliselt kasutama String # iga_sari selle asemel.

#! / usr / bin / env rubiin
str = "Ta muutis mind hiidlaseks!"
str.split (''). mõlemad teevad | c |
paneb c
lõpp

Tagastatud massiivi pikkuse piiramine

Nii et tagasi meie nime parsimisnäite juurde, mis juhtuks, kui kellelgi on perekonnanimes tühikut? Näiteks hollandi perekonnanimed võivad sageli alata tähega "van" (tähendab "" või "pärit").

Me tahame tõesti ainult kolme elementi massiiv, nii et saame kasutada teist argumenti String # split mida oleme seni ignoreerinud. Eeldatakse, et teine ​​argument on a Fixnum. Kui see argument on positiivne, saab massiivis täita palju elemente. Nii et meie puhul tahaksime selle argumendi jaoks läbida 3.

#! / usr / bin / env rubiin
print "Mis on su täisnimi? "
täisnimi = saab.chomp
nimi = täisnimi.jaotatud (/ \.? \ s + /, 3)
paneb kirja "Teie eesnimi on # {name.first}"
paneb kirja "Teie keskmine initsiaal on # {nimi [1]}"
paneb kirja "Teie perekonnanimi on # {name.last}"

Kui juhime seda uuesti ja anname sellele hollandi nime, siis toimib see ootuspäraselt.

$ ruby ​​split.rb
Mis on teie täisnimi? Vincent Willem van Gogh
Teie eesnimi on Vincent
Teie keskmine initsiaal on Willem
Teie perekonnanimi on van Gogh

Kui see argument on aga negatiivne (mis tahes negatiivne arv), siis nende arvu ei piirata elemendid väljundmassiivis ja võimalikud piirdepiirid kuvatakse nullpikkuste stringidena välja lõpus massiiv.

Seda näidatakse selles IRB-jaotises:

: 001> "see on, test, .split (',', -1)
=> ["see", "on", "a", "test", "", "", "", ""]
instagram story viewer