Hogyan oszthatjuk a húrokat a Ruby-ban

Ha a felhasználói bevitel nem egyetlen szó vagy szám, akkor ennek a bevitelnek kell lennie hasított vagy karakterláncok vagy számok listájává vált.

Például, ha egy program a teljes nevét kéri, beleértve a középső kezdőbetűt is, először ezt a bemenetet három részre kell osztania húrok mielőtt működni tudna az egyéni kereszt-, kereszt- és vezetéknévvel. Ezt a String # osztott eljárás.

Hogyan működik a String # split?

A legalapvetőbb formájában String # osztott egyetlen argumentumot vesz fel: a mezőhatárolót karakterláncként. Ezt a határolót eltávolítják a kimenetből, és a határolóra osztott húrok sorozata kerül visszaadásra.

Tehát a következő példában, ha feltételezzük, hogy a felhasználó helyesen adja meg nevét, akkor három elemet kell kapnia Sor a felosztásból.

#! / usr / bin / env rubin
nyomtatás "Mi a teljes neve? "
full_name = gets.chomp
név = teljes_név.split ('')
azt mondja: "A keresztnév # {name.first}"
azt mondja: "A vezetékneved # {name.last}"

Ha futtatjuk ezt a programot, és beírunk egy nevet, akkor kapunk várható eredményeket. Azt is vegye figyelembe

instagram viewer
name.first és name.last egybeesések. Az név változó lesz Sor, és ez a két módszerhívás azonos lesz név [0] és neve [-1] illetőleg.

$ ruby ​​split.rb
Mi a teljes neve? Michael C. Morin
A keresztneved Michael
A vezetékneved Morin

Azonban, String # osztott egy kicsit okosabb, mint gondolnád. Ha az érv String # osztott egy karakterlánc, valóban ezt használja elválasztóként, de ha az argumentum egy karakterlánc egyetlen szóközzel (ahogy használtuk), akkor azt a következtetést vonja le, hogy bármilyen mennyiségű szóközt el szeretne osztani, és el kell távolítania a vezető szóközöket is.

Tehát, ha valamivel kissé hibás bemeneteket adnánk, például

Michael C. Morin

(plusz szóközökkel), akkor String # osztott továbbra is megtenné, amire számíthat. Ez azonban az egyetlen különleges eset, ha átad a Húr mint első érv. Rendszeres kifejezés elválasztói

Az első argumentumként megadhat egy szabályos kifejezést is. Itt, String # osztott kicsit rugalmasabbá válik. Kicsit okosabbá tehetjük a kis névbontó kódunkat is.

Nem akarjuk, hogy a periódus a középső kezdet végén legyen. Tudjuk, hogy ez egy középső kezdőbetű, és az adatbázis nem szeretne ott egy periódust, tehát szétválasztáskor eltávolíthatjuk azt. Amikor String # osztott megegyezik a reguláris kifejezéssel, ugyanolyan pontosan ugyanazt teszi, mintha éppen egyezett volna meg egy karakterlánc-elválasztóval: kihúzza a kimenetből és felosztja abban a pontban.

Tehát kicsit tovább fejleszthetjük példánkat:

$ macska split.rb
#! / usr / bin / env rubin
nyomtatás "Mi a teljes neve? "
full_name = gets.chomp
név = teljes_név.split (/ \.? \ s + /)
azt mondja: "A keresztnév # {name.first}"
azt mondja: "A középső kezdőbetű # {név [1]}"
azt mondja: "A vezetékneved # {name.last}"

Alapértelmezett rekord elválasztó

Rubin nem igazán nagy a "speciális változókon", amelyeket olyan nyelveken találhat, mint Perl, de String # osztott használ egyet, amelynek tisztában kell lennie. Ez az alapértelmezett rekordválasztó változó, más néven $;.

Globális, olyasmit, amit gyakran nem lát a Ruby-ban, így ha megváltoztatja, akkor a kód más részeire is hatással lehet - csak készen álljon arra, hogy visszavigye.

Mindazonáltal mindez a változó alapértelmezett értékként szolgál az első argumentum számára String # osztott. Alapértelmezés szerint úgy tűnik, hogy ezt a változót be van állítva nulla. Ha azonban String # osztottAz első érv a nulla, ez helyettesíti egyetlen szóközzel.

Zéró hosszúságú leválasztók

Ha a határoló átjutott String # osztott egy nulla hosszú karakterlánc vagy reguláris kifejezés, akkor String # osztott kicsit másképp fog viselkedni. Ez semmit sem fog eltávolítani az eredeti karakterláncból, és minden karakterre megosztódik. Ez lényegében a karakterláncot azonos hosszúságú tömbré alakítja, amely csak egy karakterből álló karakterláncokat tartalmaz, egy a karakterlánc minden karakteréhez.

Ez hasznos lehet a karakterlánc feletti iteráláshoz, és az 1.9.x előtti és az 1.8.7 előtti verziókban használták (amelyek a számos funkciót az 1.9.x-től kezdve a karakterláncok iterálásához egy karakterláncban anélkül, hogy fel kellene törnie multi-byte Unicode karakterek. Ha azonban azt szeretnénk, hogy egy karakterlánc felett iteráljunk, és 1.8.7 vagy 1.9.x-et használunk, akkor valószínűleg String # each_char helyette.

#! / usr / bin / env rubin
str = "Úgy változtatott meg, hogy gőtevé válik!"
str.split (''). mindegyikük | c |
c
vég

A visszaküldött tömb hosszának korlátozása

Tehát vissza a név elemzési példához, mi van, ha valakinek van szóköz utónévben? Például a holland vezetéknevek gyakran "van" -nel kezdődhetnek (jelentése "" vagy "-tól").

Nagyon csak egy három elemet akarunk sor, így használhatjuk a második érvet String # osztott amit eddig figyelmen kívül hagytunk. A második érv várhatóan a Fixnum. Ha ez az érv pozitív, akkor legfeljebb sok elem kitöltendő a tömbben. Tehát a mi esetünkben meg akarjuk adni a 3-at erre az érvre.

#! / usr / bin / env rubin
nyomtatás "Mi a teljes neve? "
full_name = gets.chomp
név = teljes_név.split (/ \.? \ s + /, 3)
azt mondja: "A keresztnév # {name.first}"
azt mondja: "A középső kezdőbetű # {név [1]}"
azt mondja: "A vezetékneved # {name.last}"

Ha ezt újra futtatjuk, és holland nevet adunk neki, akkor a vártnak megfelelően fog működni.

$ ruby ​​split.rb
Mi a teljes neve? Vincent Willem van Gogh
Vezetékneved Vincent
A középső kezdőlapod Willem
Vezetékneve van Gogh

Ha azonban ez az érv negatív (bármilyen negatív szám), akkor a következők száma nem lesz korlátozva A kimeneti tömb elemei és az esetleges véghatárolók nulla hosszúságú karakterláncokként jelennek meg a sor.

Ezt mutatja be az IRB-részlet:

: 001> "ez egy, teszt" .split (',', -1)
=> ["ez", "van", "a", "teszt", "", "", "", ""]
instagram story viewer