Kaip padalinti stygas rubine

Jei vartotojo įvestas vienas žodis ar skaičius, tai turi būti suskaidyti arba virto stygų ar skaičių sąrašu.

Pvz., Jei programa prašo jūsų vardo, įskaitant vidurinį pradinį, ji pirmiausia turės padalyti tą įvestį į tris atskiras dalis stygos prieš tai gali dirbti su jūsų individualiu vardu, pavarde ir pavarde. Tai pasiekiama naudojant Styga # padalinti metodas.

Kaip veikia stygų # padalijimas

Pačia pagrindine forma, Styga # padalinti imasi vieno argumento: lauko ribotuvas kaip eilutė. Šis ribotuvas bus pašalintas iš išvesties ir sugrąžintas eilutė, suskaidyta ant ribotuvo.

Taigi šiame pavyzdyje darant prielaidą, kad vartotojas teisingai įveda savo vardą, turėtumėte gauti trijų elementų Masyvas iš padalijimo.

#! / usr / bin / env rubinas
spausdinti „Koks tavo vardas? "
full_name = gauna.chomp
name = full_name.split ('')
iškelia „Tavo vardas yra # {name.first}“
iškelia „Tavo pavardė yra # {name.last}“

Jei vykdysime šią programą ir įvesime pavadinimą, gausime laukiamų rezultatų. Be to, atkreipkite dėmesį į tai

instagram viewer
name.first ir pavardė yra sutapimai. vardas kintamasis bus Masyvas, o šie du metodo skambučiai bus lygiaverčiai vardas [0] ir vardas [-1] atitinkamai.

$ ruby ​​split.rb
Koks tavo pilnas vardas? Michaelas C. Morinas
Tavo vardas yra Michaelas
Tavo pavardė yra Morinas

Tačiau Styga # padalinti yra šiek tiek protingesnis, nei jūs manote. Jei argumentas Styga # padalinti yra eilutė, ji iš tikrųjų naudoja ją kaip atskyriklį, bet jei argumentas yra eilutė su vienu tarpu (kaip mes naudojome), tada daroma išvada, kad norite padalinti bet kokį tarpą ir kad taip pat norite pašalinti bet kokį tarpą.

Taigi, jei norėtume pateikti šiek tiek netinkamo įėjimo, pvz

Michaelas C. Morinas

(su papildomais tarpais), tada Styga # padalinti vis tiek darytų tai, ko tikimasi. Tačiau tai yra vienintelis ypatingas atvejis, kai pravažiuoji Stygos kaip pirmasis argumentas. Reguliariosios išraiškos ribotuvai

Kaip pirmąjį argumentą taip pat galite perduoti reguliariąją išraišką. Čia Styga # padalinti tampa šiek tiek lankstesnis. Taip pat galime šiek tiek protingesnį savo vardo padalijimo kodą.

Mes nenorime laikotarpio vidurio pradžios pabaigoje. Mes žinome, kad tai vidutinė pradžia, ir duomenų bazė nenorės, kad joje būtų laikotarpis, todėl mes galime ją pašalinti, kai mes suskaidome. Kada Styga # padalinti sutampa su reguliariąja išraiška, jis daro tą patį tikslą, lyg jis būtų ką tik suderinęs eilutės skyriklį: išima jį iš išvesties ir padalija į tą tašką.

Taigi, galime šiek tiek patobulinti savo pavyzdį:

$ katė split.rb
#! / usr / bin / env rubinas
spausdinti „Koks tavo vardas? "
full_name = gauna.chomp
vardas = visas_pavadinimas.skaidytas (/ \.? \ s + /)
iškelia „Tavo vardas yra # {name.first}“
iškelia „Vidurinis pradinis numeris yra # {vardas [1]}“
iškelia „Tavo pavardė yra # {name.last}“

Numatytasis įrašų skyriklis

Rubinas nėra labai didelis dėl „specialiųjų kintamųjų“, kuriuos galite rasti tokiomis kalbomis kaip „Perlas“, bet Styga # padalinti naudoja tą, kurį turite žinoti. Tai yra numatytasis įrašų atskyrimo kintamasis, dar žinomas kaip $;.

Tai yra globalus dalykas, kurio dažnai nematote „Ruby“, todėl, jei jį pakeisite, tai gali turėti įtakos kitoms kodo dalims - būtinai pakeiskite jį atgal.

Tačiau visas šis kintamasis veikia kaip numatytoji pirmojo argumento reikšmė Styga # padalinti. Pagal numatytuosius nustatymus atrodo, kad šis kintamasis yra nulis. Tačiau jei Styga # padalintipirmas argumentas yra nulis, tai pakeis viena tarpo eilute.

Nulio ilgio ribotuvai

Jei ribotuvas perėjo į Styga # padalinti yra nulio ilgio eilutė arba reguliari išraiška, tada Styga # padalinti elgsis šiek tiek kitaip. Tai pašalins iš originalios eilutės nieko ir suskaidys kiekvieną ženklą. Tai iš esmės paverčia eilutę vienodo ilgio masyvu, kuriame yra tik vieno simbolio eilutės, po vieną kiekvienam eilutės simboliui.

Tai gali būti naudinga pakartojant eilutę ir buvo naudojama ankstesnėse 1.9.x ir ankstesnėse 1.8.7 (kurios funkcijų skaičius nuo 1.9.x), kad būtų galima pakartoti eilutės simbolius, nesijaudinant dėl ​​išskaidymo kelių baitų Unicode simboliai. Tačiau jei tai, ką tikrai norite padaryti, kartojasi per eilutę ir naudojate 1.8.7 arba 1.9.x, tikriausiai turėtumėte naudoti Styga # kiekvienas_shardas vietoj to.

#! / usr / bin / env rubinas
str = "Ji pavertė mane dilgėle!"
str.split (''). kiekvienas daro | c |
deda c
galas

Grąžintos masyvo ilgio ribojimas

Taigi grįžkime prie mūsų vardo analizės pavyzdžio, kas būtų, jei kas nors turėtų tarpelį savo pavardėje? Pavyzdžiui, olandų pavardės dažnai gali prasidėti „van“ (reiškiančios „arba“ arba „nuo“).

Mes labai norime tik 3 elementų masyvas, taigi galime naudoti antrąjį argumentą Styga # padalinti kad mes iki šiol nekreipėme dėmesio. Tikimasi, kad antrasis argumentas bus a Fixnum. Jei šis argumentas teigiamas, daugiausiai tai, kad masyve bus užpildyta daug elementų. Taigi mūsų atveju norėtume išlaikyti 3 argumentą.

#! / usr / bin / env rubinas
spausdinti „Koks tavo vardas? "
full_name = gauna.chomp
vardas = vardas_pavadinimas.skaidytas (/ \.? \ s + /, 3)
iškelia „Tavo vardas yra # {name.first}“
iškelia „Vidurinis pradinis numeris yra # {vardas [1]}“
iškelia „Tavo pavardė yra # {name.last}“

Jei mes tai pakartosime ir suteiksime jai olandišką vardą, jis veiks kaip tikėtasi.

$ ruby ​​split.rb
Koks tavo pilnas vardas? Vincentas Willemas van Gogas
Jūsų vardas yra Vincentas
Vidurinis jūsų pradinis vardas yra Vilemas
Tavo pavardė yra van Gogas

Tačiau jei šis argumentas yra neigiamas (bet koks neigiamas skaičius), tada skaičius nebus ribojamas elementai išvesties masyve ir visi galiniai ribotuvai bus rodomi kaip nulio ilgio stygos masyvas.

Tai parodyta šiame IRB fragmente:

: 001> „tai yra, bandymas“ .splitas (',', -1)
=> ["tai", "yra", "a", "testas", "", "", "", ""]