4. Haj' da malo pomiješamo

Vidjeli smo par različitih objekata (brojevi i slova), a onda definisali i par varijabli da ukažemo na te objekte; slijedi nam dio u kome ćemo pokušati da sve navedeno lijepo uklopimo u jedan program.

Moći ćemo primjetiti da, ako želimo da program ispiše 25, kod koji je napisan ispod neće raditi, jer se ne mogu sabirati brojevi i slova:


var1 = 2
var2 = '5'

puts var1 + var2


Dio je problema i to što računar ne može raspoznati da li želimo dobiti rezultat 7 (2 + 5) ili je 25 rezultat koji smo željeli. Prije nego budemo u mogućnosti sabrati ova dva objekta, treba nam ili string verzija var1 ili integer verzija var2.


Pretvorbe (konverzije)
Za pretvaranje bilo kojeg objekta u string koristimo dodatak .to_s na kraju neke varijable:
 

var1 = 2
var2 = '5'

puts var1.to_s + var2



Ispis:
25


Slično prethodnom primjeru, dodatak .to_i rezultiraće integer verzijom objekta definisanog tom varijablom, a prateći istu logiku .to_f će pretvoriti objekat vezan za neku varijablu u float. Pogledajmo sada pobliže šta ove tri metode mogu, a šta ne mogu učiniti:


var1 = 2
var2 = '5'

puts var1.to_s + var2
puts var1 + var2.to_i



Ispis:
25
7



Primjetit ćete da, čak i nakon što smo dobili string verziju var1 pozivajući .to_s metodu, var1 uvijek ukazuje na 2, a nikad na '2'. Ukoliko joj ne dodijelimo novu vrijednost/objekat (reassign) (za što nam je potreban znak '='), var1 će tokom cijelog vremena izvršenja programa ostati 2.

Hajde sada da probamo nekoliko zanimljivih (ali i nekoliko čudnih) primjera pretvorbe:


puts '15'.to_f
puts '99.999'.to_f
puts '99.999'.to_i
puts ''
puts '5 is my favorite number!'.to_i
puts 'Who asked you about 5 or whatever?'.to_i
puts 'Your momma did.'.to_f
puts ''
puts 'stringy'.to_s
puts 3.to_i



Ispis:
15.0
99.999
99

5
0
0.0

stringy
3



Ispis koji vidimo vjerovatno je proizveo iznenađenje. Prvi primjer je standardno, proizveo 15.0. Nakon toga smo pretvorili string '99.999' u float, pa u integer. Pretvorba u float je rezultirala očekivano; integer je, kao i obično, zaokružio vrijednost.

Nadalje, imali smo primjere u kojima je par neuobičajenih stringova pretvoreno u brojeve. Metoda .to_i ignoriše stvari koje ne može razumjeti, na način da prekida konverziju na mjestu gdje se „nerazumijevanje“ prvi put pojavi i nastavi sve do kraja [k.p. : iz tog razloga u ovom primjeru počinje ignorisati vrijednosti poslije 5 i nastavlja to do kraja stringa]. Tako je prvi znak pretvoren u 5, a ostali znakovi, obzirom da su počinjali slovima, ignorisani su u potpunosti,...računar je za njih odabrao samo nule.

Konačno, vidimo naše poslijednje dvije konverzije - nisu nimalo neočekivane.


Još jedan osvrt na „puts“ metodu
Nešto mi je čudna naša omiljena metoda – puts -,...pogledajte samo ovaj primjer:


puts 20
puts 20.to_s
puts '20'



Ispis:
20
20
20



Zašto sve tri metoda daju isti ispis? Dobro, posljednje dvije bi i trebale, obzirom da je 20.to_s jednako '20'. Ali, šta je s prvim primjerom, brojem 20? Kad smo već kod toga, šta uopšte znači ispisati broj 20 (kao integer)? Kad napišete dvicu i nulu na komad papira, onda pišete string, a ne vrijednost broja koji bi nastao kad bi se pridružile te dvije cifre. Broj 20 je broj (vrijednost) prstiju na rukama i nogama, nije to dvica praćena nulom.

E pa, otkrit ću vam veliku tajnu o našem prijatelju –puts-. Prije nego ova metoda da bilo kakav ispis objekta, ona koristi metodu .to_s da bi dobila string verziju objekta koji smo joj stavili u zadatak za ispisati. Ustvari, ono „S“ koje vidimo na kraju naziva ove metode, znači STRING; tako metoda –puts- znači PUT STRING.

Za ovu činjenicu se možda trenutno ne mora vezati puno uzbuđenja, ali postoji u Ruby veliki broj različitih objekata (a naučićete kako da napravite i sami svoje objekte!), te je zato lijepo znati šta će se desiti ako pokušate „putsovati“ neke malo čudnije objekte kao što su slike vaših nana ili neka omiljena pjesma. Ali,...to će doći malo kasnije...

U međuvremenu, upoznaćemo se sa par novih metoda, koje će nam dozvoliti da napišemo dosta zanimljivih programčića...


Metode „gets“ i „chomp“
Rekosmo da –puts- slovi za put string. Siguran sam da ćete lahko pogoditi šta onda –gets- znači. Baš kao što –puts- svaki put daje ispis stringa, tako –gets- uzima unose u obliku stringa.

Uzima od vas! Ma dobro, od tastature/tipkovnice. Pošto tastatura/tipkovnica „skuplja“ samo znakove (string), to u slučaju ove metode stvari teku savršeno. Ono što se ustvari dešava je da –gets- ustvari „čuči“ i čeka sve one znakove koje prospete preko tastature/tipkovnice sve dok ne pritisnete Enter. Hajde da pokušamo:


puts gets


Ispis:
Is there an echo in here?
Is there an echo in here?


Naravno, u ispisu bi bilo ono što biste vi unijeli nakon što je program pokrenut. Pokrenite program nekoliko puta, pa upišite različite unose. Sad već možemo krenuti u pisanje programa koji će donijeti malo više interakcije. U primjeru koji slijedi, upišite svoje ime u program i on će vas pozdraviti:


puts 'Hello there, and what\'s your name?'
name = gets
puts 'Your name is ' + name + '? What a lovely name!'
puts 'Pleased to meet you, ' + name + '. :)'



Hop! Nakon što sam pokrenuo program dobio sam slijedeći ispis:


Hello there, and what's your name?
Chris
Your name is Chris? What a lovely name!
Pleased to meet you, Chris. :)



Hmmm,...izgleda da, kad bih upisao, C, h, r, i, s, i pritisnuo Enter, -gets- bi zgrabio sva slova koja sam napisao, pa čak i Enter. Na sreću, postoji metoda kojia se brine za ovakve pojave –chomp-. Ova metoda izostavlja Enter koji se unese na kraju stringa, odnosno uklanja posljednji znak u stringu, ukoliko se radi o tzv. separatoru. Hajde da pokušamo preurediti malo prethodni program, sada sa upotrebom metode –chomp- :


puts 'Hello there, and what\'s your name?'
name = gets.chomp
puts 'Your name is ' + name + '? What a lovely name!'
puts 'Pleased to meet you, ' + name + '. :)'



Ispis:
Hello there, and what's your name?
Chris
Your name is Chris? What a lovely name!
Pleased to meet you, Chris. :)



Tako! To je već bolje! Primjetit ćete da varijabla „name” ukazuje na vezanu metodu gets.chomp, tako da samoj varijabli ne moramo pridruživati metodu (name.chomp).


Par stvarčica za oprobati
  • Napišite program koji traži od osobe da napiše svoje ime, srednje ime, a onda i prezime. Program bi nakon toga trebao pozdraviti osobu punim imenom i prezimenom. 

  • Napišite program koji pita osobu za omiljeni broj. Neka onda vaš program uveća taj broj za jedan i onda ispiše rezultat predloži osobi kao novi omiljeni broj.

Kad završite s ovim programima, onda možemo krenuti dalje, upoznati se s novim metodama.





------------------------------------------------
© 2003-2009 Chris Pine
http://pine.fm/LearnToProgram/
Comments