1.4.1.3. fejezet, Stringek és tartományok
Nézzük a következő kódot:
print('Enter your name: ' ) name = gets() puts( "Hello #{name}" )
A dupla idézőjelbe tett szövegbe kifejezések is tehetők. Itt alkalmazható a \n\r, a \t és egyéb kurzormozgató. Az egyszeres és kétszeres idézőjeleknél a \' és \" jelzi, hogy a szövegbe megjelenő idézőjeleket szeretnénk elhelyezni. Nagyon hasonló ebben a PHP string kezeléséhez.
Vannak olyan szövegek, amikben sok idézőjelet használunk. Ezeknél alkalmazható a következő:
<p>Saját határolójeleket is definiálhatunk, azonban ezek nem tartalmazhatnak alfanumerikus betűket, már meglévő speciális karaktersorokat (pl.: újsor, kocsi vissza). Ezeket a karaktereket a \Q után írhatjuk, az alábbiak szerint:</p> <ruby> %Q[Ez egy string, kapcsos zárójelek között]
Olyan stringeket, amiket `` jelek közé tesznek, vagy %x/ /, vagy %x{ }, a Ruby nem kiírásra használja. Ezeket az operációs rendszer végrehajtja.
puts(`dir`) puts(%x/dir/) puts(%x{dir})
Eredményként az aktuális könyvtár tartalmát kapjuk Windows rendszeren.
String összefűzésre használható a + és a << jelek, vagy elég, ha csak egymás mellé tesszük a két stringet.
s = "Hello " << "world" s = "Hello " + "world" s = "Hello " "world"
Ha a << karaktereket használjuk, számokat (integer v. másként Fixnum) is hozzáfűzhetünk a stringhez a to_s metódus meghívása nélkül.
Meg ne tévesszen bennünket az alábbi kód:
s4 = "Ez " , "nem" , " egy string!", 10 print("print (s4):" , s4, "\n")
Kimeneti értéke:
print (s4):["Ez ", "nem", " egy string!", 10]
Tömbből index alapján is kérhetünk karaktert, stringek és tömbök indexelése 0-val kezdődik. Azaz a 0. karakter az első a stringben.
s = "Hello world" puts( s[1] ) # kiírja az ASCII értékét az 'e' betűnek (101)
Speciális string kezelés
puts( s[-1,1] ) # kiírja a d betűt puts( s[-5,1] ) # kiírja a w betűt puts( s[-5,5] ) # kiírja a "world" stringet
Első paraméter az index, második paraméter a karakterszám, amennyit lekérdezzen.
A kettőspontos jelölésnél ha az elsőnél negatív számot használunk, a másodiknál is azt kell használni:
puts( s[-5..5] ) # üres string! puts( s[-5..-1] ) # kiírja a "world" szövegrészt
Újsor eltávolítás
A String osztálynak két metódusa, a chop és a chomp használható az újsor jel stringből való eltávolítására. Használata a rekord szeparátorral ($/) szorosan összefügg, ugyanis ezt távolítja el a sor végéről. A különbség a két függvény közt csak annyi, hogy a chop a sorzáró karaktert ("valami"+0.chr) is eltávolítja, ha van, vagy az utolsó karaktert, ha nincs.
A rekord szeparátor módosítható is az alábbiak szerint:
$/="*" # minden sor *-ra végződhet
A puts helyett használható a C-ben megszokott printf függvény, amivel formázottan is kiírathatunk.
%d – decimális szám
%f – lebegőpontos szám
%o – octális szám
%p – inspect objektum
%s – string
%x – hexadecimális szám
Tartományok
tartományok definiálhatók az alábbiak szerint:
a = (1..10) b = (-10..-1) c = (-10..10) d = ('a'..'z')
Ezekből a to_a metódussal lehet tömböt generálni.
a=(1..10).to_a p(a)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Tartományt lehet ciklusokban is használni:
for i in (1..10) do puts( i ) end
Heredocs
Megoldható stringek előállítása idézőjelek vagy macskakörmök között is, ám van egy jobb módja, hiszen akár több soros dokumentumokat is beemelhetünk a kódba.
hdoc1 = <<EODOC
I wandered lonely as a #{"cloud".upcase},
That floats on high o'er vale and hill...
EODOC
Ezt hívják Heredocs-nak. Az utolsó szó az előzőleg megadott kezdőszó már nem kerül bele a stringbe. Ha idézőjelek közé szeretnénk tenni a szóveget - mert a fenti macskakörmök közöttit hoz létre -, Elég a kezdőszót idézőjelek közé tenni.
hdoc2 = <<'EODOC' I wandered lonely as a #{"cloud".upcase}, That floats on high o'er vale and hill... EODOC
A záró szó mindig balra igazítva szerepel. Ha szeretnénk beljebb igazítani a záró szót, a kezdőszónál a kell alkalmazni egy kötőjelet:
hdoc3 = <<-EODOC I wandered lonely as a #{"cloud".upcase}, That floats on high o'er vale and hill... EODOC
String jelölések
Néhány különleges karakterkezelés még a végére:
p %q/dog cat #{1+2}/ #=> "dog cat \#{1+2}" p %Q/dog cat #{1+2}/ #=> "dog cat 3" p %/dog cat #{1+2}/ #=> "dog cat 3" p %w/dog cat #{1+2}/ #=> ["dog", "cat", "\#{1+2}"] p %W/dog cat #{1+2}/ #=> ["dog", "cat", "3"] p %r|^[a-z]*$| #=> /^[a-z]*$/ p %s/dog/ #=> :dog p %x/vol/ #=> " Volume in drive C is OS [etc...]"
- A hozzászóláshoz be kell jelentkezni