Autors Ingus Rūķis, 30.03.2005.

Šo darbu ir atļauts brīvi izmantot izglītošanās mērķiem, izplatīt, kopēt, pavairot, modificēt bez jebkādiem ierobežojumiem, ievietojot atbilstošu norādi par oriģinālā darba autoru.

Kas ir Ruby?

Ruby ir interpretēta scenāriju valoda, kas paredzēta ātrai un vienkāršai objektorientētai programmēšanai. Tā ir apveltīta ar ļoti labām spējām veikt visdažādākos uzdevumus, sākot no teksta apstrādes un beidzot pat ar sistēmu uzturēšanas darbiem. Tā ir vienkārša, paplašināma un neatkarīga no platformas, uz kuras tā tiek darbināta.

Tā, tāpat kā daudzas citas scenāriju valodas, ir bez maksas, ar atvērtu izejas tekstu - jums ir visas iespējas to pavairot, modificēt un izplatīt.

Ruby iezīmes:

  • Vienkārša sintakse, kura ir veidota balstoties uz Eiffel un Ada programmēšanas valodām.
  • Pieejama izņēmuma situāciju apstrādes funkcionalitāte, kas ir līdzvērtīga tai, kāda ir pieejama Java vai Python programmēšanas valodās.
  • Ruby ir pilnībā objektorientēta valoda. Tas nozīmē, ka visi dati šajā valodā ir objekti tā vistiešākajā nozīmē, bez izņēmumiem. Piemēram, valodā Ruby skaitlis 1 ir klases Fixnum instance.
  • Objektorientētās īpašības šajā valodā ir projektētas ļoti uzmanīgi, lai tās būtu pilnīgas un tajā pašā laikā arī paplašināmas. Piemēram, Ruby ir iespēja izpildes laikā pievienot gan klasei, gan arī klases instancei jaunas metodes. Tādējādi, ja ir nepieciešamība, ir iespējams panākt, ka kāda klases instance darbojas savādāk, nekā visas pārējās šīs klases instances.
  • Ruby atbalsta tikai parasto mantošanu. Neskatoties uz to, ka Ruby neatbalsta daudzkāršo mantošanu, tā tomēr ir realizējama, pēc autoru domām, labākā veidā - izmantojot moduļus (metožu kolekcijas).
  • Ruby ļauj izmantot divu veidu koda blokus - atdalītus ar ‘do .. end’ un ar figūriekavām ‘{ .. }’.
  • Ruby valodā ir iebūvēts nederīgās atmiņas atbrīvotājs (garbage collector), kas programmētāja vietā nodarbojas ar visas izmantojamās atmiņas uzskaiti un atbrīvošanu.
  • Ruby piedāvā labi dokumentētu lietojumprogrammas saskarni (API), kas ļauj C programmētājiem vienkārši paplašināt šīs valodas iespējas. Ir pieejama arī SWIG saskarne.
  • Valodā Ruby veselos skaitļus var (un vajag) lietot neatkarīgi no to izmēra. Ruby automātiski noteiks, kāda izmēra skaitlis tas ir un izvēlēsies attiecīgu klasi. Ja skaitlis būs mazāks, tiks izmantota Fixnum klase, ja skaitlis neietilps šīs klases robežās, skaitļa objekts tiks automātiski konvertēts uz Bignum klases instanci.
  • Ruby nav nepieciešams definēt mainīgos. Šī programmēšanas valoda izmanto vienkāršu mainīgo nosaukšanas tehniku, lai norādītu mainīgo darbības apgabalu (variable scope). Piemēram: lietojot vienkārši ‘var’, jūs iegūstat lokālu mainīgo, ‘@var’ būs instances mainīgais, bet ‘$var’ - globāls mainīgais. Tādējādi nav arī nepieciešamības programmējot objektorientētu klasi katra mainīgā priekšā rakstīt ’self.’.
  • Ja to pieļauj operētājsistēma, tad Ruby ļauj dinamiski ielādēt valodas paplašinājumus.
  • Ruby iespēju sarakstā ir arī no operētājsistēmas neatkarīga pavedienu tehnoloģija (threading). Tādējādi, jūs varat izmantot šo tehnoloģiju arī uz operētājsistēmām, kuras neatbalsta šo tehnoloģiju, piemēram, MS DOS.
  • Ruby ir neatkarīga no platformas, uz kuras tā darbojas. Lai arī lielākoties tā tiek izmantota izstrādei Linux vidē, tā darbojas arī uz daudziem UNIX paveidiem, DOS, Windows 95/98/Me/NT/2000/XP, MacOS, BeOS, OS/2 un citām operētājsistēmām.

Ruby vēsture

Par Ruby rašanās laiku var uzskatīt 1993. gada sākumu - 24. februāri. Programmēšanas valodas autors Yukihiro Matsumoto stāsta, ka sācis ar kolēģi runāt par objektorientētas scenāriju valodas iespējamību, tās ērtumu un citām labajām īpašībām. Tajā laikā programmēšanas valodas autors jau ir pārzinājis Perl4 programmēšanas valodu, taču tā viņam nav patikusi. Tāpat viņš jau ir pārzinājis Python programmēšanas valodu, taču arī tā viņam nav likusies gana piemērota un esot bijusi sajūta, ka tā ir parasta programmēšanas valoda, kurai ir pievienotas objektorientētas valodas īpašības. Tā vietā viņš vēlējās pilnīgi objektorientētu, vienkārši lietojamu un iespējām bagātu scenāriju valodu.

Pēc ilgiem meklējumiem viņam tā arī neizdevās šādu valodu atrast un viņš izlēma izveidot pats savu.

Izmantojot savu 15 gadu laikā iegūto pieredzi objektorientētā programmēšanā, autors skaidri zināja, ko tieši viņš vēlas un ķērās pie darba.

1995. gada decembrī Ruby versija 0.95 tika parādīta plašākai publikai Japānas ziņu grupās. Kopš tā laika valoda ir attīstījusies, ir izveidojušās neskaitāmas Ruby fanu un programmētāju mājas lapas, kas ļoti palīdz piesaistīt arvien jaunus programmētājus šai valodai.

Referāta rakstīšanas laikā jaunākā Ruby pieejamā versija bija 1.8.2

Ruby sintakse

Mainīgie

Ruby tāpat, kā jebkura cita programmēšanas valoda izmanto mainīgos, lai veidotu atsauces uz kādu atmiņas apgabalu. Tā kā Ruby ir pilnībā objektorientēta valoda, tad var droši teikt, ka mainīgie šajā valodā vienmēr norāda uz kādu objektu.

Programmējot šajā valodā ir jābūt diezgan uzmanīgam ar lielo un mazo burtu lietojumu, jo Ruby ir reģistrjūtīga valoda. Tas nozīmē, ka mainīgie var1 un vAr1 ir divi atšķirīgi mainīgie. Jāievēro arī tas, ka mainīgie nedrīkst sākties ar lielo burtu, jo šis pieraksts ir rezervēts konstantēm. Gadījumā, ja jūs mēģināsiet pieļaut šādu kļūdu, Ruby jūs par to laipni brīdinās:

City = "Riga"
City = "Tallin"
=>	warning: already initialized constant City

Ja jums ir nepieciešams griezties pie kāda objekta konstantes, tad tam var izmantot dubultu kolu:

Objekts::Konstante

Vai arī, ja jūs griežaties pie konstantes no klases iekšienes, tad var iztikt arī bez objekta nosaukuma:

::Konstante

Neinicializētiem mainīgajiem pēc noklusējuma ir vērtība nil.

Valodā Ruby ir arī tā sauktie pseido - mainīgie:

  • self - pašreizējās metodes saņēmējs;
  • nil - NilClass instance (false);
  • true - TrueClass instance (true);
  • false - FalseClass instance (false);
  • __FILE__ - pašreizējā faila nosaukums;
  • __LINE__ - pašreizējās rindiņas nosaukums.

Šo mainīgo vērtības nav izmaināmas, mēģinot piešķirt tiem vērtību, tiek izveidota izņēmuma situācija.

Komentāri

Valodā Ruby komentāru rakstīšanai izmanto vairākas pieejas. Ja ir nepieciešams vienkārši nokomentēt vienu rindiņu, tad šīs rindiņas sākumā jāpieraksta simbols #. Ja ir nepieciešamība pēc garāku komentāru rakstīšanas, tad var izmantot šādu sintaksi:

=begin
komentārs
komentaars
=end

Ruby interpretators ignorēs visu, kas ir starp attiecīgajām begin un end iezīmēm.

Skaitļi

Ruby tāpat, kā gandrīz visas citas programmēšanas valodas piedāvā darbu gan ar veseliem, gan peldošā punkta skaitļiem.

Vienmēr, kad jūs darbojaties tikai ar veseliem skaitļiem, Ruby jums atgriezīs veselu skaitli. Piemēram, ja jūs izpildīsiet operāciju variable = 3/2, tad variable vērtība būs nevis matemātiskais rezultāts 1.5, bet gan 1, jo visi darbībā iesaistītie skaitļi ir veseli. Ja jums ir nepieciešamība pēc rezultāta ar peldošo punktu, tad vienkārši kāds no skaitļiem ir jānorāda kā skaitlis ar peldošo punktu: variable = 3.0/2.

Līdzīgi kā citas programmēšanas valodas, arī Ruby piedāvā skaitļu saskaitīšanu (+), atņemšanu (-), reizināšanu(*), dalīšanu(/) un dalīšanu pēc atlikuma(%). Atšķirībā no citām programmēšanas valodām, papildus tiek piedāvāts arī skaitļu kāpināšanas operators (**), kuru var izmantot skaitļu kāpināšanai, piemēram, šādi:

variable = base**power

Darbam ar skaitļiem, Ruby piedāvā arī interesantu lielo skaitļu ievadīšanas paņēmienu. Pieņemsim, ka jums ir jāievada skaitlis 170000000000000. Daudzās lietojumprogrammās šo skaitli jūs ieraudzītu kā 170 000 000 000 000, lai būtu ērtāk sekot līdzi pareizai datu ievadei. Izrādās, ka Ruby izstrādātāji par to ir padomājuši un ļauj jums skaitļus ievadīt gandrīz šādā formātā. Gandrīz tāpēc, ka atstarpju vietā ir jāizmanto apakšvītra (_):

variable = 170_000_000_000_000

Tieši tāpat var darboties arī ar ļoti maziem skaitļiem:

variable = 0.000_000_000_000_321

Protams, var izmantot arī zinātnisko pierakstu un to pašu pierakstīt kā:

variable = 1.7e14

un

variable = 3.21e-13

Darbā ar skaitļiem, ir iespējams lietot arī saīsināto aritmētisko darbību pierakstu, piemēram, tā vietā, lai rakstītu a = a + b, jūs varat vienkārši rakstīt a += b. Tieši tāpat var darīt ar jebkuru citu aritmētisku operāciju.

Teksta virknes

Ruby teksta virknes ir vienkāršas 8-bitu virknes. Parastā gadījumā tās satur drukājamus simbolus, taču īpašos gadījumos teksta virknēs ir iespējams glabāt arī binārus datus. Teksta virknes ir string klases instances.

Teksta virkņu veidošana notiek līdzīgi kā citās programmēšanas valodās - tās ir simbolu virknes, kuru sākumā un beigās ir atdalītājsimboli, piemēram, pēdiņas. Atkarībā no pēdiņu tipa var lietot dažādus izvairīšanās simbolus (escape characters). Ja tiek lietotas parastās pēdiņas, tad, lai iegūtu atpakaļ krītošo slīpsvītru, tā ir jāraksta divas reizes, bet lai iegūtu parasto pēdiņu, tās priekšā ir jāraksta atpakaļ krītošā slīpsvītra:

variable = 'kaut kaads teksts ar parasto peedinju''
variable2 = ' un atpakaljkriitosho sliipsviitru '

Ja tiek lietotas dubultās pēdiņas, tad šādas izvairīšanās kombinācijas (escape sequences) ir daudz vairāk.

Bez pēdiņām var lietot arī citus teksta virkņu pieraksta veidus, piemēram:

%q/general single-quoted string/
%Q!general double-quoted string!
%Q{Seconds/day: #{24*60*60}}

Tāpat tiek atbalstīta arī HEREDOC sintakse:

aString = <<END_OF_STRING
    The body of the string
    is the input lines up to
    one ending with the same
    text that followed the '<<'
END_OF_STRING

Ievērības cienīgas ir arī dažas no darbībām ar tekstu, kuras pēc noklusējuma piedāvā Ruby programmēšanas valoda.

Ja parastās programmēšanas valodās pati par sevi saprotama ir teksta virkņu saskaitīšana (konkatenācija: ‘a’ + ‘b’ = ‘ab’), tad Ruby piedāvā ne tikai saskaitīt, bet arī reizināt teksta virknes:

Variable = 'Labdien! ' * 3
=> Labdien! Labdien! Labdien!
Variable = '1' * 2
=> '11'

Atsevišķos gadījumos ļoti noderīgas var izrādīties arī dažas nestandarta teksta virkņu klases metodes, piemēram, reverse, next, un citas:

"hello".reverse
=> "elleh"
"hello".next
=> "hellp"

Teksta virknēs ir iespējama arī mainīgo vērtību iekļaušana:

"my name is #{$ruby}"
# teksta virknē #{$ruby} tiks aizvietots ar globālā mainīgā
# ruby vērtību

Regulārās izteiksmes

Teksta virknes, kas atrodas starp slīpsvītrām ir regulārās izteiksmes. To sintakse ir identiska ar citās programmēšanas valodās pieņemto:

/^Ruby the OOPL/
#(teksta virkne, kas sākas ar 'Ruby the OOPL')

Masīvi

Masīvu izmantošana Ruby valodā ir pavisam vienkārša - atliek tikai mainīgajam piešķirt figūriekavās esošu vērtību sarakstu, kas atdalīts ar komatu un mainīgais jau ir masīvs:

ary = [1, 2, "3"]

Acīgākie uzreiz pamanīs, ka šajā piemērā divi no masīva elementiem ir integer objekti, bet trešais - string objekts. Nekādas kļūdas šeit nav, jo Ruby tāpat, kā citas interpretējamas scenāriju valodas atļauj masīvā glabāt dažādu datu tipu vērtības.

Arī piekļuve masīvu vērtībām ir pavisam vienkārša - ir iespējams piekļūt gan individuālām vērtībām, gan arī masīva apakškopai:

ary[0]
ary[1..2]

Ruby valodā ir atļauts izmantot arī asociatīvus masīvus jeb tādus masīvus, kuru indeksi ir nevis skaitļi, bet teksta virknes. Skaidrības labad būtu vērts pieminēt, ka Ruby dokumentācijā asociatīvus masīvus sauc par ‘hashes’ vai ‘dictionaries’. Asociatīvu masīvu veidošanai izmanto figūriekavas:

h = {1 => 2, "2" => "4"}

Datu tipu maiņa

Ļoti bieži programmētājiem ir nepieciešams veikt datu tipu nomaiņu, lai veiktu kaut kādas darbības ar šiem datiem. Arī Ruby ir padomāts par to, kā ērti nomainīt datu tipu kādam objektam. Katram objektam tam ir definētas šādas metodes:

Metode Konvertē
No Uz
String#to_i String Integer
String#to_f String Float
Float#to_i Float Integer
Float#to_s Float String
Integer#to_f Integer Float
Integer#to_s Integer String

Piemēri:

34.to_s
=> "34"
"12".to_i
=> 12
"abc".to_i
=> 0

Cikli

Kā jau iepriekš minēts, Ruby valodā ir iespējams veidot koda blokus. Tieši ciklos tad arī rodas vajadzība pēc koda bloku veidošanas. Tā kā Ruby atbalsta divus bloku veidošanas veidus (do .. end un { .. }), tad programmētājam ir lieliskas iespējas izvēlēties sev tīkamāko sintaksi. Lai nu kā vismaz vienas programmas ietvaros vajadzētu pieturēties pie vienas sintakses, savādāk ir ļoti vienkārši radīt lielu jucekli programmas izejas tekstā.

Vienkāršs cikls valodā Ruby izskatās šādi:

count = 0;
3.times do
      count += 1
end

Ja nav skaidri zināms cikla reižu skaits, tad skaitļa 3 vietā var izmantot arī jebkuru integer tipa mainīgo:

NumberOfTimes = 592;
count = 0
NumberOfTimes.times do
      count += 1
end

Neliels piemērs faktoriāla aprēķināšanai:

number = 6
count = 0
product = 1

number.times do
      count += 1
      product *= count
end
puts number.to_s + "! = " + product.to_s

Bez šādiem noteikta garuma cikliem, ir pieejami arī While cikli, kuri izpildās tik ilgi, kamēr padotā izteiksme ir patiesa.

count = 0
while count < 10
      count += 1
end

Noteikti, ka daudziem jau būs radusies interese par to, kā Ruby valodā tiek veidoti for cikli. Arī šeit ir zināmas atšķirības no pierastajām, modernajām valodām kā C/C++, Java, Object Pascal, utt.

For cikls tiek veidots apmēram šādi:

for elt in collection
  ...
end 

Ja to uzrakstītu cilvēkiem saprotamā valodā, tad tas izklausītos apmēram šādi - for cikls iet cauri visai kolekcijai un katrā ciklā elt vērtību piešķir nākamajai kolekcijas vienībai. Varbūt izklausās sarežģīti, bet tas tā nebūt nav. Piemēram, vienkāršs for cikls, kas izpildās 3 reizes:

for num in (4..6)
      print num,"\n"
end

Lai varētu labāk saprast, kāpēc tiek izmantota šāda sintakse, varam aplūkot vēl vienu piemēru, kurā kā kolekcija tiek izmantots masīvs:

for elt in [100,-9.6,"pickle"]
      print "#{elt}\t(#{elt.type})\n"
end

Ir acīmredzami, ka programmēšanas valodas autors ir piedomājis pie tā, lai programmētāji varētu nedomāt par to, kā veidot for ciklus atkarībā no datu tipiem un situācijām - visos gadījumos var izmantot vienu un to pašu pieeju.

Tāpat ir pieejami arī while un until cikli, kas būtībā ne ar ko īpaši neatšķiras no citās programmēšanas valodās pierastajiem. Viena no būtiskām niansēm ir cikla operatoru kā modifikatoru izmantošanas iespēja. Ar tās palīdzību ir iespējams veidot šāda tipa izteiksmes:

expr until expr

Kas programmas kodā varētu izskatīties kā:

work until tired

Tieši tāpat ir iespējams darboties arī ar while ciklu.

Kā vēl viens jaunums dažiem varētu būt iteratori, kas ir izmantojami dažādu kolekciju (masīvu) apstaigāšanai. Piemēram, šādi var apstaigāt masīvu un veikt ar tā vērtībām vajadzīgās darbības:

[1,2,3].each do |i| print i*2, "\n" end

Darbojoties ar iteratoriem, noderīgi varētu likties dažādi varianti, kā sākt iterāciju no sākuma, pārlekt kādai vērtībai pāri, vai pārtraukt iterācijas. Tam ir paredzētas speciālas komandas kā next, redo un break.

Kontroles struktūras

Valodā Ruby tāpat, kā citās programmēšanas valodās ir pieejamas klasiskās kontroles struktūras kā if, case un citas. Atšķirībā no citām programmēšanas valodām, ir pieejamas arī dažas citas kontroles struktūras. Piemēram, apgrieztais if:

unless expr
	# ...
else
	# ...
end 

Lai arī vienmēr var iztikt arī ar parasto if kontroles struktūru, ir redzams, ka programmēšanas valodas autori ir pievērsušies vieglāk lasāma programmas izejas teksta veidošanai. Tā vietā, lai izmantotu negāciju, var vienkārši izmantot apgriezto if.

Šo pašu unless kontroles struktūru var pierakstīt arī savādāk:

print "stop" unless valid($password)

Kas šajā gadījumā izdrukās vārdu stop, ja vien mainīgajā $password nav pareiza parole.

Secinājumi

Valoda Ruby mani galvenokārt ieinteresēja kādas grāmatas dēļ. Tā kā savu bakalaura darbu rakstu par koda ģeneratoru izmantošanu, tad lasīju J. Herrington grāmatu ‘Code generation in action’, kurā par pamatvalodu koda ģeneratoriem tika izmantota tieši šī valoda. Uzrakstot šo referātu esmu vēl jo vairāk ieinteresēts šīs valodas apguvē, jo tā patiešām liekas samērā vienkārša, taču tajā pašā laikā ļoti spēcīga un ar pārdomātu sintaksi - tieši tā, kā to bija vēlējies pats valodas autors.

Tā kā pēc profesijas esmu tīmekļa aplikāciju izstrādātājs, tad mani jo īpaši interesē iepazīties ar “Ruby on Rails”, kas ir Ruby valodai domāts tīmekļa aplikāciju izstrādes ietvars (framework).

Literatūras saraksts