Cum se împarte șuvițele în rubin

Cu excepția cazului în care introducerea utilizatorului este un singur cuvânt sau un număr, va trebui să fie necesară această intrare Despică sau transformat într-o listă de șiruri sau numere.

De exemplu, dacă un program vă cere numele complet, inclusiv inițialul intermediar, va trebui mai întâi să împărțiți intrarea în trei separat siruri de caractere înainte de a putea lucra cu individul, prenumele și prenumele. Acest lucru se realizează cu ajutorul Șirul # divizat metodă.

Cum funcționează șirul # split

În forma sa cea mai de bază, Șirul # divizat ia un singur argument: delimitatorul de câmp ca șir. Acest delimiter va fi eliminat din ieșire și o serie de șiruri împărțite pe delimitator vor fi returnate.

Deci, în următorul exemplu, presupunând că utilizatorul își introduce numele corect, ar trebui să primiți un element cu trei elemente mulțime din despărțire.

#! / usr / bin / env ruby
print "Care este numele tău complet? "
nume complet = devine.chomp
nume = nume complet = nume.split ('')
introduce „Prenumele tău este # {name.first}"
pune „Numele tău este # {name.last}"
instagram viewer

Dacă rulăm acest program și introducem un nume, vom obține câteva rezultate așteptate. De asemenea, rețineți că numele primul și name.last sunt coincidențe. Nume variabilă va fi o mulțime, iar cele două apeluri la metodă vor fi echivalente cu Numele [0] și nume [-1] respectiv.

$ rubin split.rb
Care este numele tau complet? Michael C. Morin
Prenumele tău este Michael
Numele tău este Morin

In orice caz, Șirul # divizat este un pic mai inteligent decât ai crede. Dacă argumentul la Șirul # divizat este un șir, chiar îl folosește ca delimitator, dar dacă argumentul este un șir cu un singur spațiu (așa cum am folosit), atunci se produce că doriți să împărțiți orice cantitate de spațiu alb și că, de asemenea, doriți să eliminați orice spațiu alb.

Deci, dacă ar fi să-i oferim unele informații ușor malformate, cum ar fi

Michael C. Morin

(cu spații suplimentare), apoi Șirul # divizat ar face tot ce este de așteptat. Cu toate acestea, acesta este singurul caz special atunci când treceți un Şir ca prim argument. Delimitatori de expresie regulată

Puteți transmite, de asemenea, o expresie obișnuită ca prim argument. Aici, Șirul # divizat devine ceva mai flexibil. Putem face, de asemenea, micul nostru cod de împărțire a numelor un pic mai inteligent.

Nu dorim perioada de la sfârșitul primei inițiale. Știm că este o inițială mijlocie, iar baza de date nu va dori o perioadă acolo, așa că o putem elimina în timp ce ne despărțim. Cand Șirul # divizat se potrivește cu o expresie obișnuită, face același lucru exact ca și cum tocmai ar fi asortat un delimitator cu șiruri: îl scoate din ieșire și îl împarte în acel moment.

Deci, putem evolua puțin exemplul nostru:

$ pisica split.rb
#! / usr / bin / env ruby
print "Care este numele tău complet? "
nume complet = devine.chomp
name = nume_complet.split (/ \.? \ s + /)
introduce „Prenumele tău este # {name.first}"
pune „Inițialul tău de mijloc este # {nume [1]}”
pune „Numele tău este # {name.last}"

Separator de înregistrări implicite

Rubin nu este foarte mare pentru „variabilele speciale” pe care le puteți găsi în limbi precum Perl, dar Șirul # divizat folosește unul de care trebuie să fii conștient. Aceasta este variabila implicită a separatorului de înregistrări, cunoscută și sub numele de $;.

Este un lucru global, ceva ce nu vezi deseori în Ruby, așa că dacă îl schimbi, acesta ar putea afecta alte părți ale codului - trebuie doar să fii sigur că îl vei schimba la final.

Totuși, toată această variabilă face ca valoare implicită pentru primul argument Șirul # divizat. În mod implicit, această variabilă pare a fi setată la zero. Cu toate acestea, dacă Șirul # divizatprimul argument este zero, îl va înlocui cu un singur șir spațial.

Delimitatori de lungime zero

Dacă delimitatorul a trecut la Șirul # divizat este un șir de lungime zero sau o expresie regulată, atunci Șirul # divizat va acționa un pic diferit. Nu va elimina nimic deloc din șirul inițial și va împărți fiecare personaj. În mod esențial, se transformă șirul într-un tablou de lungime egală care conține doar șiruri de un caracter, unul pentru fiecare caracter din șir.

Acest lucru poate fi util pentru iterarea peste șir și a fost utilizat în pre-1.9.x și pre-1.8.7 (care a suportat un număr de funcții de la 1.9.x) pentru a itera peste caractere dintr-un șir, fără să vă faceți griji despre despărțire multi-octet Caractere Unicode. Cu toate acestea, dacă ceea ce doriți cu adevărat să faceți este să iterați pe un șir și utilizați 1.8.7 sau 1.9.x, probabil că ar trebui să utilizați String # each_char in schimb.

#! / usr / bin / env ruby
str = "Ea m-a transformat într-un capăt nou!"
str.split (''). fiecare face | c |
pune c
Sfârșit

Limitarea lungimii matricii returnate

Deci, înapoi la exemplul nostru de analiză a numelor, ce se întâmplă dacă cineva are un spațiu în numele său? De exemplu, numele de familie olandeze pot începe adesea cu "van" (însemnând "din" sau "din").

Vrem doar un element cu 3 elemente mulțime, deci putem folosi al doilea argument pentru Șirul # divizat pe care până acum am ignorat-o. Al doilea argument este de așteptat să fie a Fixnum. Dacă acest argument este pozitiv, cel mult, că multe elemente vor fi completate în tablou. Deci, în cazul nostru, am dori să trecem 3 pentru acest argument.

#! / usr / bin / env ruby
print "Care este numele tău complet? "
nume complet = devine.chomp
nume = nume_complet.split (/ \.? \ s + /, 3)
introduce „Prenumele tău este # {name.first}"
pune „Inițialul tău de mijloc este # {nume [1]}”
pune „Numele tău este # {name.last}"

Dacă rulăm din nou acest lucru și îi dăm un nume olandez, acesta va acționa așa cum era de așteptat.

$ rubin split.rb
Care este numele tau complet? Vincent Willem van Gogh
Prenumele tău este Vincent
Inițialul tău de mijloc este Willem
Numele tău este van Gogh

Cu toate acestea, dacă acest argument este negativ (orice număr negativ), atunci nu va exista nicio limită la numărul de elementele din tabloul de ieșire și orice delimitatori de final vor apărea ca șiruri de lungime zero la sfârșitul matrice.

Acest lucru este demonstrat în acest fragment IRB:

: 001> "aceasta, este, a, testează" .split (',', -1)
=> ["aceasta", "este", "a", "test", "", "", "", ""]
instagram story viewer