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...]"