Ja vien lietotāja ievadītais vārds nav viens vārds vai cipars, tam ir jābūt sadalīt vai pārvērtās par virkņu vai skaitļu sarakstu.
Piemēram, ja programma pieprasa jūsu vārdu un uzvārdu, ieskaitot vidējo sākotnējo, tai vispirms būs jāsadala šī ievade trīs atsevišķās daļās stīgas pirms tas var strādāt ar jūsu individuālo vārdu, uzvārdu un uzvārdu. Tas tiek panākts, izmantojot Stīgu # sadalīt metode.
Kā String # split darbojas
Visvienkāršākajā formā Stīgu # sadalīt ņem vienu argumentu: lauka norobežotājs kā virkne. Šis norobežotājs tiks noņemts no izvades, un virkne, kas sadalīta pa norobežotāju, tiks atgriezta.
Tātad, šajā piemērā, pieņemot, ka lietotājs pareizi ievada savu vārdu, jums jāsaņem trīs elementi Masīvs no sadalījuma.
#! / usr / bin / env rubīns
print "Kāds ir jūsu vārds un uzvārds? "
full_name = gets.chomp
name = full_name.split ('')
liek "Tavs vārds ir # {name.first}"
liek "Jūsu uzvārds ir # {name.last}"
Ja mēs izpildīsim šo programmu un ievadīsim vārdu, mēs iegūsim gaidītos rezultātus. Turklāt ņemiet to vērā
name.first un vārds.pasākums ir sakritības. vārds mainīgais būs Masīvs, un šie divi metodes izsaukumi būs līdzvērtīgi vārds [0] un vārds [-1] attiecīgi.$ ruby split.rb
Kāds ir tavs pilnais vārds? Maikls C. Morins
Tavs vārds ir Maikls
Tavs uzvārds ir Morins
Tomēr Stīgu # sadalīt ir mazliet gudrāks, nekā jūs domājat. Ja arguments uz Stīgu # sadalīt ir virkne, to patiešām izmanto kā norobežojumu, bet, ja arguments ir virkne ar vienu atstarpi (kā mēs izmantojām), tad tiek secināts, ka vēlaties sadalīt uz jebkura atstarpes daudzuma un ka jūs vēlaties noņemt arī visu atstarpi.
Tātad, ja mēs tam sniegtu nedaudz nepareizi ievadītu informāciju, piemēram,
Maikls C. Morins
(ar papildu atstarpēm), tad Stīgu # sadalīt joprojām darītu to, kas tiek gaidīts. Tomēr tas ir vienīgais īpašais gadījums, kad nokārtojat a Stīgu kā pirmais arguments. Regulārās izteiksmes atdalītāji
Kā pirmo argumentu jūs varat arī nodot regulāro izteiksmi. Šeit, Stīgu # sadalīt kļūst mazliet elastīgāks. Mēs varam arī padarīt mūsu mazo vārdu sadalīšanas kodu mazliet gudrāku.
Mēs nevēlamies periodu vidējā sākuma beigās. Mēs zinām, ka tas ir vidējais sākums, un datu bāze nevēlas tur periodu, tāpēc sadalīšanas laikā mēs to varam noņemt. Kad Stīgu # sadalīt sakrīt ar parasto izteiksmi, tas izdara tieši to pašu, ko it kā būtu tikko pieskaņojis virknes norobežotājam: tas to izņem no izejas un tajā brīdī sadala.
Tātad mēs varam nedaudz attīstīt savu piemēru:
$ kaķis split.rb
#! / usr / bin / env rubīns
print "Kāds ir jūsu vārds un uzvārds? "
full_name = gets.chomp
vārds = pilns_vārds.split (/ \.? \ s + /)
liek "Tavs vārds ir # {name.first}"
liek "Sākotnējais vidējais skaitlis ir # {vārds [1]}"
liek "Jūsu uzvārds ir # {name.last}"
Noklusējuma ierakstu atdalītājs
Rubīns nav īsti liels "speciālajiem mainīgajiem", kurus jūs varētu atrast tādās valodās kā Perls, bet Stīgu # sadalīt izmanto tādu, kas jums jāzina. Šis ir noklusējuma ierakstu atdalītāja mainīgais, pazīstams arī kā $;.
Tas ir globāls, kaut ko tādu, ko bieži neredzat Ruby, tāpēc, ja to mainīsit, tas varētu ietekmēt citas koda daļas - vienkārši pārliecinieties, ka mainiet to atpakaļ, kad esat pabeidzis.
Tomēr viss šis mainīgais darbojas kā noklusējuma vērtība pirmajam argumentam Stīgu # sadalīt. Pēc noklusējuma šķiet, ka šis mainīgais ir iestatīts uz nulle. Tomēr, ja Stīgu # sadalītpirmais arguments ir nulle, tas to aizstās ar vienu atstarpes virkni.
Nulles garuma atdalītāji
Ja norobežotājs pāriet uz Stīgu # sadalīt ir nulles garuma virkne vai regulārā izteiksme, tad Stīgu # sadalīt rīkosies mazliet savādāk. Tas no sākotnējās virknes vispār nenoņems un sadalīsies pa visām rakstzīmēm. Tas būtībā pārvērš virkni par vienāda garuma masīvu, kurā ir tikai vienas rakstzīmes virknes, pa vienai katrai virknes rakstzīmei.
Tas var būt noderīgi, lai atkārtotu virkni, un tas tika izmantots pirms 1.9.x un iepriekšējās 1.8.7 (kas funkciju skaits no 1.9.x), lai atkārtotu virknes rakstzīmes, neuztraucoties par sadalīšanu daudzbaitu Unikoda rakstzīmes. Tomēr, ja tas, ko jūs patiešām vēlaties darīt, atkārtojas pa virkni un jūs izmantojat 1.8.7 vai 1.9.x, jums, iespējams, vajadzētu izmantot Stīga # katrs_čārs tā vietā.
#! / usr / bin / env rubīns
str = "Viņa mani pārvērta par ūsu!"
str.split (''). katrs dara | c |
liek c
beigas
Atgrieztā masīva ierobežošana
Tātad, atgriežoties pie mūsu vārda parsēšanas piemēra, kā būtu, ja kādam ir uzvārds uzvārdā? Piemēram, holandiešu uzvārdi bieži var sākties ar “van” (nozīmē “” vai “no”).
Mēs patiešām vēlamies tikai trīs elementus masīvs, tāpēc otro argumentu mēs varam izmantot Stīgu # sadalīt ka mēs līdz šim esam ignorējuši. Paredzams, ka otrais arguments būs a Fixnum. Ja šis arguments ir pozitīvs, augstākais, ka daudzi elementi tiks aizpildīti masīvā. Tātad mūsu gadījumā mēs gribētu nodot 3 par šo argumentu.
#! / usr / bin / env rubīns
print "Kāds ir jūsu vārds un uzvārds? "
full_name = gets.chomp
name = full_name.split (/ \.? \ s + /, 3)
liek "Tavs vārds ir # {name.first}"
liek "Sākotnējais vidējais skaitlis ir # {vārds [1]}"
liek "Jūsu uzvārds ir # {name.last}"
Ja mēs to atkal vadīsim un piešķirsim holandiešu vārdu, tā rīkosies kā gaidīts.
$ ruby split.rb
Kāds ir tavs pilnais vārds? Vinsents Vilems van Gogs
Tavs vārds ir Vincents
Jūsu vidējā sākotnējā ir Vilems
Tavs uzvārds ir van Gogs
Tomēr, ja šis arguments ir negatīvs (jebkurš negatīvs skaitlis), tad to skaits netiks ierobežots elementi izvades masīvā un visi atdalītāji tiks parādīti kā nulles garuma virknes masīvs.
Tas ir parādīts šajā IRB fragmentā:
: 001> "tas ir, pārbaudi" .split (',', -1)
=> ["this", "is", "a", "test", "", "", "", ""]