한국   대만   중국   일본 
Ruby (програмски ?език) ? Википеди?а Пре?и на садржа?

Ruby (програмски ?език)

С Википеди?е, слободне енциклопеди?е
(преусмерено са Руби (програмски ?език) )
Руби (програмски ?език)
Изговара се Руби
По?авио се 1995. ; пре 29 година  ( 1995 )
Аутор(и) ?укихиро Мацумото
Актуелна верзи?а 2.6.5
Датум актуелне верзи?е 1.10.2019.
Систем типова динамички
Имплементаци?е Ruby MRI , YARV , JRuby , Rubinius , IronRuby , MacRuby , HotRuby
Утица?и Перл , Па?тон , Lisp , C++ , Smalltalk , Dylan, CLU
Оперативни системи сви знача?ни?и
Лиценца Руби Лиценца
Веб-са?т www.ruby-lang.org
Документаци?а Документаци?а

Руби ( енгл. Ruby ) ?е об?ектно ори?ентисани програмски ?език. У себи комбину?е синтаксу инспирисану ?езицима Перл и Ада , са об?ектно ори?ентисаним особинама налик ?езику Smalltalk (Smalltalk), а дели и неке особине са ?езицима Па?тон , Lisp , Dylan и CLU. Руби ?е ?еднопролазни интерпретирани ?език. ?егова главна имплементаци?а ?е слободни софтвер под лиценцом отвореног кода .

?укихиро ?Мац“ Мацумото ( Yukihiro Matsumoto ) ?е са разво?ем овог ?езика почео у фебруару 1993. године. Први пут ?е об?ав?ен 1995. године, а тренутно ?е актуелна стабилна верзи?а 1.9.3-p0 ко?а се може преузети са званичне стране ?езика. По многим програмерима, Руби сли?еди принцип ?на?ма?ег изнена?е?а“, чиме мисле да ?е та? ?език ослобо?ен свих замки и контрадикторности познатих из других ?езика. Име ?руби“ потиче од енглеске ри?ечи за ? рубин “ ( енгл. Ruby ) што ?е само алузи?а на ?перл“ (енглески ? бисер ").

Руби ?е дуго времена био чисто ?апанска по?ава, гд?е ?е постигао велику популарност, отприлике ?еднаку као Перл или Па?тон . Документаци?а ?е посто?ала само на ?апанском. ?Мац“ ?е тек кра?ем милени?ума кренуо са активностима популаризаци?е тог програмског ?езика и изван ?апана. Веома брзо ?е прихва?ен и убрзо затим су об?ав?ени многобро?ни чланци у стручним часописима као и документаци?а на другим ?езицима.

Рани концепти [ уреди | уреди извор ]

“Разговарао сам са колегом о могу?ностима об?ектно-ори?ентисаног скрипт ?езика . Знао сам Perl , али ми се ни?е стварно сви?ао, ?ер ?е био налик на toy ?езике. Об?ектно-ори?енстисани ?езици су деловали врло обе?ава?у?е. Тада сам научио Python . Али ми се ни?е сви?ао, ?ер нисам мислио да ?е прави об?ектно-ори?ентисани ?език: имао ?е само неке карактеристике ОО као додатке. Као залу?еник програмским ?езицима и фан ОО ве? 15 година, заиста сам желео истински об?ектно ори?ентисан, ?едноставан за употребу програмски ?език. Тражио сам, али нисам могао прона?и ?едан. Зато сам одлучио да га направим.”

Мацумото опису?е да ?е диза?н Руби?а ?едноставан као ?езгро ?езика 
Lisp
, са системом об?еката налик на 
Smalltalk
 и практичне корисности као 
Perl
.

Прво изда?е [ уреди | уреди извор ]

Прво ?авно изда?е програмског ?езика Руби [1] 0.95 об?ав?ено ?е на ?апанске newsgroup 21. децембра 1995. године. Након тога, ?ош три верзи?е програмског ?езика су об?ав?е?е у два дана. Након об?ав?ива?а Руби 0.95 , неколико стабилних верзи?а ?езика су об?ав?е?е у наредним годинама:

  • Руби 1.0 децембар 25, 1996
  • Руби 1.2: децембар 1998
  • Руби 1,4: август 1999
  • Руби 1.6: септембар 2000
Године 1997,  об?ав?ен ?е први чланак о ?езику Руби на интернету. Исте године, Матсумото ?е ангажован од стране  netlab.jp да ради као full-time developer у програмском ?езику Руби.
Године 1998. године, покренута ?е апликаци?а Ruby Application Archive , за?едно са ?едноставном страницом на енглеском ?езику за Ruby. 
Године 1999,  Мацумото и Кеи?у Исхитсука су написали прву к?игу(The Object-Oriented Scripting Language Ruby, октобар 1999.) о овом програмском ?езику, за ко?и ?е порасло интересова?е и ван ?апана, То ?е пра?ено об?ав?ива?ем ?ош 20 к?ига о овом ?езику у ?апану, ране 2000. године.
До 2000. године, Ruby ?е постао популарни?и него 
Python
 у ?апану.  У септембру 2000. године, прва к?ига на енглеском ?езику, Programming Ruby
[2]
 ?е штампана, док ?е несто касни?е пуштена у слободну прода?у, што ?е продубило усва?а?е овог програмског ?езика и у другим зем?ама. 

На?нови?е верзи?е програмског ?езика Руби:

  • Руби 2.5.0 [3] , октобар 2017.
  • Руби 2.4.2 [4] , септембар 2017.
  • Руби 2.3.5 [5] , септембар 2017.

Филозофи?а програмског ?езика Ruby [6] [ уреди | уреди извор ]

Мацумото ?е рекао да ?е Руби диза?ниран за продуктивност програмера и забаву, на начелима доброг диза?на корисничког интерфе?са . На Google Tech Talk-u, 2008. године Мацумото да?е наводи: “Надам се да ?е Ruby помо?и сваком програмеру у свету да би буде продуктивни?и, и да ужива у програмира?у, и да буде сре?ни?и. То ?е примарна сврха ?езика Руби. “ Он наглашава да диза?н система треба да пре задово?и потребе човека, а не рачунара.

“Често ?уди, посебно програмери, фокусира?у се на машине. Они мисле: “Раде?и ово машина ?е радити  брже, успешни?е...”  Они се фокусира?у на машине. Али, у ствари, морамо да се фокусирамо на ?уде, на начин програмира?а  или ради управ?е?а апликаци?ама. Ми смо господари. Они су робови.”

?език Ruby треба да пошту?е принцип ПОЛА, што значи да треба да се понаша на такав начин да минимизира забуне за искусне кориснике. Мацумото ?е рекао да ?е ?егов примарни ци? диза?на ?е био да се направи ?език ко?и он сам ужива користи, сма?у?у?и рад програмера и могу?у забуну. Он ?е рекао да ни?е применио принцип ПОЛА у диза?ну ?езика, али ?е без обзира на то фраза у блиско? асоци?аци?и са ?езиком Ruby. Фраза ?е и сама била извор изнена?е?а, посто су многи почетни корисници могли да помисле да ?език Руби опонаша понаша?е других ?езика. У ма?у 2005. године дискуси?ом на newsgroup.comp.lang.ruby, Мацумото покушао да дистанцира Руби од ПОЛА принципа, об?аш?ава?у?и да пошто ?е било ко?и избор диза?на изнена?у?у?и за некога, он користи лични стандард у процени изнена?е?а. Ако смо доследни у личном стандарду, би?е ма?е изнена?е?а за упознате са стандардом.

Мацумото ?е то об?аснио на следе?и на?ин: "Сви има?у сопствену позадину. Неки програмира?у у Python -у, неки у Perl -y, И они могу бити изнена?ени различитим аспектима ?езика. Онда они до?у код мене И кажу: “Био сам изнена?ен овом карактеристиком ?езика, тако да Руби нарушава принцип на?ма?ег изнена?е?а”. Чека?. Чека?. Принцип на?ма?ег изнена?е?а ни?е само за тебе. Односи се на принцип мог на?ма?ег изнена?е?а и односи се на принцип на?ма?ег изнена?е?а након што научиш Руби веома добро. На пример, ?а сам био C++ програмер пре него сто сам започео диза?нира?е ?езика Руби. Програмирао сам иск?учиво у C++ две или три године. И после две године C++ ме И да?е изнена?у?е."

Особине [ уреди | уреди извор ]

  • ?едноставна и чит?ива синтакса
  • ?Чисто“ об?ектно ори?ентисани ?език (слично Smalltalkу )
    • ?Све“ ?е об?ект
    • Насле?ива?е од модула, ум?есто вишеструког насле?ива?а
    • Уникатне методе ( Singleton )
    • Динамична пром?ена имена и надоград?а класа приликом изврше?а програма
    • Итератори
    • Преписива?е оператора
    • Интроспекци?а ( Reflection )
  • Нетипизоване вари?абле
  • Обрада изузетака
  • аутоматско ослоба?а?е непотребно заузете мемори?е ( garbage collection )
  • подршка Перлових регуларних израза (?ош непотпуна)
  • подршка на више оперативних система
  • ?единствен интерфе?с за приступ базама података
  • аутоматска документаци?а (слично javadoc)
  • могу?ност и функционалног и процедуралног програмира?а
  • либерална лиценца (ГНУ или по же?и)

Руби ?е потпуно об?ектно ори?ентисан . Све промен?иве су об?екти, што важи, за разлику од ?аве ( java ), и за примитивне типове.

Опште карактеристике програмског ?езика Руби [ уреди | уреди извор ]

Руби ?е интерпретирани програмски ?език , што значи да се изворни кoд преводи у кoд разум?ив рачунару приликом сваког извршава?а програма. Очити ?е недостатак интерпретираних програмских ?езика то да су спори?и него компа?лирани програмски ?езици као што ?е на пример C . Предност ?е ?ихова ве?а флексибилност и кра?е време израде програма. Руби ?е потпуно об?ектно- ори?ентисан програмски ?език, што значи да се програмски проблеми решава?у дефиниса?ем класа, а из класа наста?у по?единачни об?екти. ?една ?е од предности об?ектно-ори?ентисаног приступа то да он олакшава рад на великим про?ектима ?ер ?е задатак могу?е поделити на више програмера, од ко?их сваки може засебно радити на ?едно? класи или на више ?их. На почетку рада се дефинишу поруке ко?е се могу слати одре?еном об?екту, а након тога програмери има?у слободу писати и ме?ати кoд унутар класе под условом да поруке оста?у непроме?ене. Об?ектно-ори?ентисана метода решава?а проблема врло ?е ефикасна ?ер рашчла?у?е проблеме на природан начин сличан ономе ко?и се употреб?ава у решава?у проблема у свакодневном животу.

Руби припада отвореном коду буду?и да ?е об?ав?ен под лиценцом ГПЛ [7] . Временом ?е об?ав?ено више алтернативних интерпретера програмског ?езика Руби. На?познати?и ?е JRuby [8] ко?и ?е написан у програмском ?езику Java .

Предности и недостаци [ уреди | уреди извор ]

За Руби се каже да има природну синтаксу. Наиме, синтакса програмског ?езика Руби не садржи непотребне знакове и стога кoд написан у програмском ?езику Руби остав?а утисак ?асно?е и ?едноставности.

Пример ?едноставности синтаксе:

Претпоставимо да желимо да поша?емо поруку напуни_гориво об?екту мо?_ауто уколико резервоар ни?е пун:

 moj_auto.napuni_gorivo unless moj_auto.spremnik_pun? 

Приметимо да ?е синтакса ?едноставна, без сувишних знакова у запису наредбе, за разлику од синтаксе других програмских ?езика.

Руби-“програмеров на?бо?и при?ате?” [9] [ уреди | уреди извор ]

Руби ?е замиш?ен као програмски ?език ко?и олакшава рад програмеру лако?ом кориш?е?а, ?едноставнош?у и флексибилнош?у. Усмереност на програмера очита ?е у свим деловима програмског ?езика. На?очити?и пример за то ?е могу?ност писа?а кода на више различитих начина. Ево неколико примера:

  puts “Hello,world” или puts(“Hello,world”)
  {“jedan”, “dva”, “tri”} 

Тестови [ уреди | уреди извор ]

Исправ?а?е грешака у коду (енг. bug ) врло ?е тежак посао, нарочито након што се заврши разво? и кра??им корисницима програм преда на употребу. На?бо?е ?е открити што ве?и бро? грешака приликом саме израде програма.

Руби омогу?ава писа?е тестова ко?и тестира?у изворни кoд. То ?е нова програмерска парадигма ко?а омогу?ава бржи разво? и самим тим ма?е трошкове разво?а програма.Програмери ко?и пишу програме у програмском ?езику Руби врло се често користе тестовима и они су интегрални дио сваког озби?ног прошире?а или програма.

Покрета?е програма [ уреди | уреди извор ]

На??едноставни?и ?е начин покрета?а кода креира?е датотеке с програмским кодом и покрета?е те датотеке наредбом ruby. Датотеке ко?е садрже кoд написан у програмском ?езику Руби обично (по договору) има?у екстензи?у .rb.

  ruby мо?_програм.rb 

Основе програмског ?езика Руби [ уреди | уреди извор ]

Промен?иве [ уреди | уреди извор ]

Промен?ива ?е симболичко име ко?ем ?е придружена нека вредност. Промен?ива ?е сво?еврсно складиште (део мемори?е рачунара) у ко?ем се налази неки податак.

  >> moja_promenljiva = 7 

Том ?е наредбом промен?иво? ко?а се зове мо?а_промен?ива придружена вредност 7. Ако се након тога у неком изразу употреби име мо?а_промен?ива, интерпретер ?е из мемори?е рачунара узети вредност промен?иве мо?а_промен?ива (ко?а у том случа?у износи 7) и ук?учи?е ?е у израз на месту на ко?ем се споми?е.

  >> puts moja_promenljiva * 2 
  14

Вредност промен?иве се може ме?ати. Приступ промен?иво? ко?о? ни?е придружена вредност резултира поруком о грешци.

Типови података [ уреди | уреди извор ]

Сваки податак ?е одре?еног типа. Основни типови података у програмском ?езику Руби ?есу бро?еви, низови знакова (енг. string) и по?а (енг. аrrays).

Низови знакова(стринг) [ уреди | уреди извор ]

Низови знакова (енг. string) могу се у програмском ?езику Руби написати на више начина. На?чеш?е се користе двоструки наводници:

  >> "ovo je string"
  => "ovo je string" 

Двоструки наводници омогу?ава?у умета?е и извршава?е израза унутар самог стринга:

  >> "Ja imam #{100 + 100} dinara" 
  => "Ja imam 200 dinara"

Низови знакова могу се написати и користе?и ?едноструке наводнике. У том случа?у ни?е могу?е у низове знакова уметати и извршавати изразе те уписивати посебне знакове:

  >> puts 'Ja imam #{100 + 100} dinara\ndrugi red'
  Ja imam #{100 + 100} dinara\ndrugi red

У програмском ?езику Руби nil представ?а непосто?е?у или недефинисану вредност.

Hash-таблице (по?а) [ уреди | уреди извор ]

Тип података под називом по?е (енг. hash ) сличан ?е низу, али за к?учеве можемо користити било ко?у вредност. Низ има сво? редослед, па ако прескочимо индекс, ствара?у се вредности нил. Код по?а то ни?е случа? буду?и да индекс може бити било ко?и тип података па не може бити речи о очекиваном редоследу индекса.

По?е се дефинише употребом витичастих заграда:

  >> a = {} 
  => {}

Вредности унутар по?а дода?у се на исти начин као и код низова:

  >> a["kljuc"] = "Vrednost" 
  => "Vrednost"
  >> a 
  => {"kljuc"=>"Vrednost"} 

По?е можемо дефинисати и тако да му одмах доделимо вредност:

  >> boja_kose = { 
     'ivan' => 'plava', 
     'marija' => 'crna', 
     'suzana' => 'plava'
  }

Карактеристика програмског ?езика Руби су и симболи: Симбол на?чеш?е представ?а неки об?екат из реалног света. Сличан ?е низу знакова, али заузима ма?е мемори?е. Назив симбола почи?е двотачком и затим се настав?а као низ знакова и бро?ева.

  boja_kose= {
   :ivan => 'plava',
   :marija => 'crna',
   :suzana => 'plava', 
   :petar => 'crvena' 
  }

Контролне структуре и пет?е [ уреди | уреди извор ]

IF [ уреди | уреди извор ]

Контролна структура се може користити на више начина: Основни начин:

  >> if (2 > 1) then 
  >> puts "istina"
  >> end 
  istina 
  => nil 

Свака контролна структура мора завршити изразом end. Заграде и к?учна реч then нису обавезни, а можемо све написати у ?едном реду одва?а?у?и изразе тачком са зарезом:

  >> if 2 > 1 ; puts "istina"; end 
  istina 
  => nil 

Ако имамо само ?едну наредбу ко?у желимо извршити у случа?у да ?е тест истинит, можемо користити следе?и начин писа?а:

  >> puts "istina" if 2 > 1 
  istina 
  => nil 

Контролно? структури if можемо додати к?учну реч else као и у многим другим програмским ?езицима:

  >> if 5 > 10
  >> puts "istina" 
  >> else 
  >> puts "nije istina" 
  >> end 
  nije istina 
  => nil 

Руби подржава и к?учну реч unless ко?а има супротан учинак од к?учне речи if и наме?ена ?е побо?шава?у изгледа и чит?ивости кода:

  >> puts "nije istina" unless 2 < 1 
  nije istina 
  => nil

WHILE/UNTIL [ уреди | уреди извор ]

Контролне структуре while и until користе се слично као у осталим програмским ?езицима:

  >> a = 0 
  => 0 
  >> while a < 5 
  >> puts a 
  >> a = a + 1 
  >> 
  end 
  0 
  1 
  2
  3 
  4 
  => nil 

Контролна структура until ради обратно од контролне структуре while:

  >> a = 0 
  => 0 
  >> until a > 5 
  >> print a 
  >> a = a + 1 
  >> end 
  0 1 2 3 4 5 
  => nil

Системске наредбе [ уреди | уреди извор ]

Руби омогу?ава извршава?е системских наредби у ?усци оперативног система [10] на следе?и начин:

  >> system "echo Ovo je sistemska naredba unutar ljuske" 
  Ovo je sistemska naredba unutar ljuske
  => true

Излаз наредбе испису?е се на екран. Ако ?е наредба успешно извршена, т?. ако ?е повратни кoд ?еднак нули, вра?а се вредност true. У свим осталим случа?евима вра?а се вредност false. Ако желимо записати излаз од системске наредбе у неку промен?иву, то можемо учинити на следе?и начин:

  >> a = `echo Ovo je naredba unutar ljuske`
  => "Ovo je naredba unutar ljuske\n" 
  >> puts a
  Ovo je naredba unutar ljuske 
  => nil 

Успешност изврше?а наредбе (излазни кoд) можемо проверити на следе?и начин:

  >> $?.exitstatus
  => 0

Нула значи да ?е наредба успешно извршена, а сви остали кодови означава?у грешку.

Напомена: Имена константи у програмском ?езику Руби се састо?е иск?учиво од великих слова.

Вишеструко придружива?е вредности промен?ивима [ уреди | уреди извор ]

Понекад желимо доделити више различитих вредности у више различитих промен?ивих. То чинимо на следе?и начин:

  >> a, b, c = 1, 2, 3
  => [1, 2, 3] 

Уколико на десно? страни знака за доде?ива?е посто?и више вредности ко?е су одво?ене зарезима, из ?их се ствара низ. Након тога чланови низа придружу?у се редом промен?ивима на лево? страни. Проучимо што се дога?а ако на десно? страни израза има више вредности него што има промен?ивих на десно? страни:

  >> a,b = 1,2,3 
  => [1, 2, 3] 
  >> a => 1 
  >> b => 2 

У овом случа?у бро? три ни?е придружен ни?едно? промен?иво?. Проучимо шта се дога?а у супротном случа?у ? ако ?е на лево? страни наведено више промен?ивих него што има вредности на десно? страни:

  >> c = 100 
  => 100
  >> a, b, c = 1, 2 
  => [1, 2] 
  >> c 
  => nil

Буду?и да ни?е било дово?но вредности на десно? страни, промен?иво? c придружена ?е вредност nil (Null). Претходна вредност промен?иве c (бро? 100) ни?е сачувана.

У програмском ?езику Руби могу?е ?е заменити вредности промен?ивих на ?едноставни?и нацин без кориш?е?а додатне, привремене промен?иве:

a, b = b, a

Класе и методи [ уреди | уреди извор ]

Класе су заокружене целине ко?е се састо?е од кода ко?и ?е потребан за извршава?е одре?еног задатка. Дефиниса?е класа заправо представ?а дефиниса?е кода. Класу креирамо користе?и к?учну реч class и након тога наво?е?ем имена класе. Име класе мора почети великим словом. Након што смо навели име класе, дефинишемо све методе ко?е класа садржи и на кра?у додамо к?учну реч end.

Метода ?е део кода ко?и извршава одре?ени задатак унутар класе. Методе су саставни део сваке класе. Дефиниса?е класе у ствари значи дефиниса?е метода. Креира?емо класу Аутомобил ко?а се састо?и од методе светла ко?а испису?е "Ук?учу?ем светла".

  >> class Automobil
  >> def svetla 
  >> puts "Uklju?ujem svjetla" 
  >> end 
  >> end 

Посто?е одре?ена правила при именова?у метода. Имена метода ко?е нешто проверава?у и вра?а?у логичку вредност на?чеш?е завршава?у упитником.

  >> niz = ["a","b","c"] 
  => ["a", "b", "c"] 
  >> niz.include?("a")
  => true 

У овом примеру метода include? проверава да ли ?е неки об?екат члан низа или ни?е. Имена метода ко?е ме?а?у вредност промен?ивих над ко?има су позване на?чеш?е завршава?у узвичником:

  >> a = "Srce"
  => "Srce" 
  >> a.upcase 
  => "SRCE"
  >> a => "Srce"
  >> a.upcase! 
  => "SRCE"
  >> a 
  => "SRCE"

У програмском ?езику Руби могу?е ?е дефинисати методе без наво?е?а имена класе ко?о? метода припада. Следе?и пример показу?е такав случа?:

  >> def moje_vrijeme 
  >> puts "Sada je #{Time.now}" 
  >> end 
  => nil

Поред метода инстанце, ко?е се позива?у након што смо креирали об?екат, посто?и ?ош ?една врста метода ко?е се зову методе класе или статичке методе (енг. static method). Такве методе се дефинишу кориш?е?ем к?учне реци self. Испред имена. Пример:

  >> class Automobil 
  >> def self.boje 
  >> %w( crvena zelena bela plava crna ) 
  >> end 
  >> end

Тако дефинисану методу бо?е можемо испробати на само? класи:

  >> Automobil.boje 
  => ["crvena", "zelena", "bijela", "plava", "crna"]

Дефинишимо две методе поздрав: ?едну као методу класе, а другу као методу инстанце. Нека класа има име Квадрат.

  >> class Kvadrat 
  >> def self.pozdrav 
  >> puts "Pozdrav od klase Kvadrat!" 
  >> end 
  >> def pozdrav 
  >> puts "Pozdrav od objekta klase Kvadrat!" 
  >> end 
  >> end

Позовимо методу класе:

  >> Kvadrat.pozdrav 
  Pozdrav od klase Kvadrat! 

Позовимо методу инстанце:

  >> Kvadrat.new.pozdrav 
  Pozdrav od objekta klase Kvadrat! 

У пракси се ве?ина метода дефинише као методе инстанце, а тек се у ретким случа?евима праве методе класе. На пример, листа могу?их бо?а универзална ?е за сваки аутомобил па смо зато методу бо?е креирали унутар класе Аутомобил. Као што посто?е промен?иве инстанце, тако у програмском ?езику Руби посто?е и промен?иве класа. Имена промен?ивих класа почи?у с два знака @ (@@), за разлику од имена промен?ивих инстанци чи?а имена почи?у с ?едним знаком @. Досег промен?ивих класа ?е цела класа, за разлику од промен?ивих инстанци чи?и ?е досег об?екат ко?ем припада?у. Промен?иве класа су корисне ако желимо забележити неки податак ко?и се односи на целу класу.

Об?екти [ уреди | уреди извор ]

Об?екат ?е конкретна имплементаци?а или реализаци?а неке класе. Креира?е об?екта:

  moj_auto=Automobil.new

Методе ко?е служе за креира?е об?еката одре?ене класе зову се конструктори. Конструктори се тако?е могу позивати наводе?и аргумент, чиме нам омогу?ава?у да поставимо почетне вредности сваком новом об?екту ко?и креирамо.

“Све ?е об?екат”:

У програмском ?езику Руби све ?е об?екат, ук?учу?у?и и основне типове података. Служе?и се методом class, можемо дознати ко?о? класи припада неки об?екат. Децимални бро?еви припада?у класи Float:

  >> 2.1.class 
  => Float 

Бро? два ?е об?екат класе Fixnum:

  >> 2.class 
  => Fixnum

Чак ?е и nil об?ект:

  >> nil.class 
  => NilClass 

Атрибути и промен?иве [ уреди | уреди извор ]

Сваки об?екат ко?и креирамо из одре?ене класе обично садржи промен?иве ко?е одражава?у ?егово ста?е. Такве промен?иве се зову промен?иве инстанце (енг. instance variables) и ?ихово име почи?е знаком @. Дакле, иако можемо направити више об?еката из класе Аутомобил, сваки од тих об?еката ?е имати сво?е властите промен?иве. Претпоставимо да желимо забележити неке карактеристике аутомобила као што су произво?ач, модел, година производ?е, снага мотора, бо?а или бро? пре?ених километара. Све те карактеристике одре?еног конкретног аутомобила записа?емо у промен?иве инстанце. Промен?ивима инстанце не можемо приступити директно ве? путем метода. Пример:

  >> class Automobil 
  >> def postavi_boju(x)
  >> @boja = x 
  >> end 
  >> def ocitaj_boju 
  >> @boja 
  >> end 
  >> end

Програмски ?език Руби користи приступнике атрибутима ради ?едноставни?ег И чит?иви?ег кода. Пример:

  class Automobil 
  attr_accessor :proizvodjac, :model, :godina_proizvodnje, :snaga_motora, :prijedjeni_kilometri 
  end

К?учна реч attr_accessor класи дода?е методе ко?е омогу?ава?у чита?е и писа?е у именоване промен?иве. Испред имена промен?ивих наводимо знак :

Сада можемо употребити приступнике и за друге промен?иве:

  >> a.proizvodjac = "Zastava" 
  => "Zastava" 
  >> a.model = "Fi?o" 
  => "Fi?o" 
  >> a.godina_proizvodnje = 1971 
  => 1971 
  >> a.snaga_motora = 10 
  => 10 
  >> a.predjeni_kilometri = 0 
  => 0

Насле?ива?е [ уреди | уреди извор ]

Многе класе сличне су ?една друго? тако да нема потребе дефинисати све методе у свако? класи. Можемо прво дефинисати генералну класу са свим главним методама. Након тога можемо креирати специфичне класе ко?е има?у ?ош неке посебне функци?е. На пример, уколико желимо дефинисати класу Кабриолет можемо узети све методе из посто?е?е класе Аутомобил и додати ?ош неке посебне методе. Ако желимо да нека класа наследи све методе из неке друге класе, у први ред дефиници?е дода?емо знак < иза имена класе ко?у дефинишемо и навести име класе од ко?е се насле?у?у методе. У следе?ем примеру дефиниса?емо класу Кабриолет ко?а насле?у?е све методе класе Аутомобил и има ?едну додатну методу за спушта?е крова:

  class Kabriolet < Automobil 
  def spusti_krov 
  puts "Spu?tam krov!" 
  end 
  end 

На ова? начин избегавамо умножава?е кода. Ако су две класе сличне, можемо креирати за?едничке методе у за?едничко? класи и онда свака од класа може наследити методе из за?едничке класе и имати ?ош неке додатне.

Уланчава?е метода [ уреди | уреди извор ]

Попут израза и методе се у програмском ?езику Руби могу уланчавати. Претпоставимо да низ знакова желимо исписати великим слова обрнутим редоследом. ?едан од начина ?е следе?и:

  >> a = "Ovo je string"
  => "Ovo je string" 
  >> a = a.upcase! 
  => "OVO JE STRING" 
  >> a = a.reverse! 
  => "GNIRTS EJ OVO" 
  >> puts a 
  GNIRTS EJ OVO 
  => nil 

Користе?и уланчава?е метода исти резултат можемо пости?и у само ?едном реду:

  >> puts "Ovo je string".upcase.reverse 
  GNIRTS EJ OVO 
  => nil

Блокови и итератори [ уреди | уреди извор ]

Блокови и итератори ?една су од специфичности програмског ?езика Руби. У другим програмским ?езицима посто?е функци?е и процедуре ко?е позивамо ?едним или с више аргумената. Ти аргументи могу бити бро?еви, низови знакова и други типови података. Ме?утим, у програмском ?езику Руби могу?е ?е као параметар задати не само податке ве? и сам програмски кoд. Заокружени кoд ко?и можемо посматрати као целину се зове блок. Дефинишимо ?едноставну методу:

  >> def novi_blok 
  >> puts "Po?etak ponavljanja." 
  >> yield 
  >> yield 
  >> puts "Kraj ponavljanja." 
  >> end 
  => nil 

У гор?ем смо примеру дефинисали методу нови_блок. Посебност ?е те методе да садржи к?учну реч yield ко?а извршава блок ко?и ?е послат у позиву те методе. Позва?емо методу ко?у смо управо дефинисали наводе?и као аргумент при позива?у те методе други програмски кoд - блок. Та? се блок састо?и од само ?едне наредбе ко?а испису?е "Поздрав свима!":

  >> novi_blok{ puts "Pozdrav svima!" } 

  Po?etak ponavljanja.
  Pozdrav svima!
  Pozdrav svima!
  Kraj ponavljanja.

Дакле, блокови се не третира?у на исти начин као други аргументи ко?и се преносе функци?ама. Аргументи ко?и нису блокови евалуира?у се пре позива функци?е док се блокови евалуира?у тек приликом позива методе ?иелд у телу функци?е. Блок може примати аргументе сваки пут када га извршимо, па се блокова користе на?чеш?е за имплементаци?у итератора. Итератор ?е специ?ална метода ко?а извршава блок на сваком члану низа. На пример: a| puts a.upcase >> end

  ZGRADA 
  ULICA
  CESTA 
  => ["zgrada", "ulica", "cesta"] 

Прво смо дефинисали низ ко?и се састо?и од три члана. Сваки од тих чланова ?е низ знакова. Након тога смо позвали методу ко?а ?е итератор ко?и редом за сваки члан низа извршава задани блок преда?у?и му наведеног члана низа као параметар. Исто смо могли написати и на кра?и начин, користе?и витичасте заграде уместо к?учних речи do и end: a| puts a.upcase }

Рад са датотекама [ уреди | уреди извор ]

Датотеке се у програмском ?езику Руби отвара?у на следе?и начин: f = File.new("/etc/passwd","r") f.close

Датотека ?е отворена у модулу за чита?е и доде?ена промен?иво? f.

Наредбом f.close затворили смо датотеку.

Чита?е и писа?е [ уреди | уреди извор ]

Метод readline чита ?едну лини?у из датотеке. Метод getc чита следе?их 8 битова и претвара их у код.

Методе lineno i pos служе за одре?ива?е места на коме се налазимо у датотеци (метод lineno одре?у?е у ком се реду налазимо, a metod pos карактер до кога смо стигли).

ПРИМЕР:

file = File.new("/etc/passwd","r")
puts file.lineno
puts file.pos
file.readline
puts file.lineno
puts file.pos
puts file.getc
file.close

Ispis:

0
0
root:x:0:0:root:/root:/bin/bash
1
32
98

Za pisanje u datoteke mozemo koristiti metode: puts, print. Metod puts na kraj upisa dodaje oznaku za novi red, a metod print ne!

ПРИМЕР:

 file = File.new("/tmp/moja_datoteka", "w")
 #<File:/tmp/moja_datoteka> 
 file.puts "Prvi red"
 file.close

Датотеке можемо одмах учитати као низ карактера, без посебног отвара?а, помо?у метода read:

a = File.read("/etc/inittab")

Класа File садржи ?ош многе методе ко?и се могу извршавати без отвара?а датотеке.

На пример можемо сазнати име директори?ума у ко?е се налази датотека, име датотеке или ?ену величину:

 File.dirname("/tmp/moja_datoteka") 
 => "/tmp"
 File.basename("/tmp/moja_datoteka")
 => "moja_datoteka"
 File.size("/etc/passwd")
 => 2057

Рад са директори?умима [ уреди | уреди извор ]

Програмски ?език Руби садржи и многе друге могу?ности у раду са директори?умима и датотекама. Зато га неки употеб?ава?у као замену за програмира?е у ?усци оперативног система ( bash ).

Уколико желимо да видимо у ком директори?уму се налазимо, користимо следе?у наредбу:

Dir.pw

Управ?а?е именима датотека [ уреди | уреди извор ]

Датотекама можемо приступити и наводе?и само ?ихово релативно име (т?. релативну пута?у) узима?у?и у обзир наш тренутни директори?ум.

У програмском ?езику Руби посто?и класа Pathname, ко?а садржи методе за управ?а?е именима датотека.

Класа Pathname ?е "спо?аш?а" класа па ?е морамо учитати пре почетка рада:

 require 'pathname'

Об?екат класе Pathname креирамо на следе?и начин: (у овом примеру користимо реалтивно име датотеке уз претпоставку да се тренутно налазимо у директори?уму /root):

  p = Pathname.new("Mail")

Класа Pathname омогу?ава више од 70 операци?а над именима датотека и самим датотекама. На?знача?ни?е од ?их су:

  p.realpath    #metod vraca puno ime datoteke (odnosno apsolutnu putanju)
  p.directory?    #vraca true ako je u pitanju direktorijum, u suprotnom false
  p.file?    #vraca true ako je u pitanju datoteka, u suprotnom false
  p.basename    #izdvaja ime datoteke
  p.dirname    #izdvaja ime direktorijuma u kojem se ta datoteka nalazi

Програмски ?език Руби поседу?е специ?алну промен?иву ко?а садржи име датотеке са ко?ом тренутно радимо. Та промен?ива се зове __FILE__ и и омогу?ава нам позива?е осталих датотека ко?е се налазе у том истом директори?уму.

Наредба File.dirname(__File__) упу?у?е на директори?ум у коме се налази програм ко?и смо покренули.

Бриса?е и копира?е датотека [ уреди | уреди извор ]

Метод delete користимо за бриса?е датотеке:

  File.delete("/tmp/moja_datoteka")

Проверу да ли посто?и датотека вршимо помо?у метода exist?:

  if File.exist?("/tmp/moja_datoteka")
      File.delete("/tmp/moja_datoteka")
  End

За копира?е датотека служимо се методом cp из класе FileUtils:

  FileUtils.cp("/etc/inittab","/tmp")

  • Као први аргумент наводи се име датотеке ко?у желимо да ископирамо
  • Као други аргумент наводимо име директори?ума у ко?и желимо да сместимо копи?у
  • Нова датотека ?е имати име: /tmp/inittab

Уколико желимо да од?едном ископирамо више датотека, као први аргумент наводи се низ:

  FileUtils.cp(["/etc/file1","/etc/file2"],"/tmp")

Класа FileUtils подржава све операци?е над датотекама ук?учу?уци рекурзивно копира?е, рекурзивно бриса?е, креира?е веза и друго

Управ?а?е грешкама [ уреди | уреди извор ]

Класа Exception [ уреди | уреди извор ]

Програмски ?език Руби омогу?ава писа?е програмског кода ко?и ?е се извршити у случа?у да програм током извршава?а наи?е на грешку.

За управ?а?е грешкама служи класа Exception.

Уколико сами не одредимо шта ?е програм радити у случа?у да се догоди нека програмска грешка, исписа?е се порука са описом грешке и прекину?е се извршава?е програма.

На пример, ако покушамо промен?иво? чи?а ?е вредност нил приступити као да ?е низ:

a = nil
a[0]

Испис:

 NoMethodError: undefined method `[]' for nil:NilClass

from (irb):2

Кoд за ко?и желимо да осигурамо посебан третман у случа?у грешке увек почи?е к?учном речи begin.

Следе?а ?е к?учна реч rescue и име класе или поткласе ко?а ?е надлежна за врсту грешке за ко?у желимо посебан третман.

Ако желимо да посебан третман вреди за било ко?у врсту грешке, наводимо класу Exception (у супротном ?емо навести неку од ?ених 30-так поткласа Након тога следи кoд ко?и ?е се извршити уколико програм наи?е на грешку.

На претходном примеру:

begin
  a[0]
  rescue Exception
     puts "Doslo je do greske!"
end

Резултат програма:

 Doslo je do greske!

У овом смо примеру смо само исписали да ?е дошло до грешке и наставили да?е извршавати кoд.

Уколико уместо к?учне реци rescue употребимо к?учну рец raise, изврши?е се кoд ко?и следи, али након тога ?е се грешка обра?ивати на стандардан предефинисан нацин.

У следе?ем примеру користимо к?учну реч raise. Исписа?е се порука "Грешка!" а након тога стандардна порука о грешци уз прекид извршава?а програма: -{

begin
  0.upcase
  rescue Exception
  puts "Greska!"
  raise
end

Испис

  Greska!
  NoMethodError: undefined method `upcase' for
  0:Fixnum
   from (irb):2
  Konverzija uspe?na

Уколико желимо да се изврши неки кoд без обзира на то ?е ли дошло до грешке или не, користимо к?учну реч ensure:

begin
  0.upcase
  rescue Exception
  puts "Greska!"
  ensure Exception
  puts "Zatvaram datoteke"
end

Испис :

  Greska!
  Zatvaram datoteke

Гор?и пример ?е пример уобича?ене употребе к?учне речи ensure (ради се о затвара?у датотека независно од тога ?е ли дошло до грешке или ни?е).

Да приликом извршава?а ни?е покренут неисправан кoд дешавало би се следе?е:

begin
  0.zero?
  rescue Exception
  puts "Greska!"
  ensure Exception
  puts "Zatvaram datoteke"
end

Испис :

Zatvaram datoteke

С' обзиром на то да ни?е дошло до програмске грешке (наредба 0.зеро? ?е исправна), не испису?е се порука Грешка!, али се извршава део кода у ко?ем пише Затварам датотеке.

Throw и catch [ уреди | уреди извор ]

Методом catch дефинише се програмски блок ко?и се нормално извршава до места позива методе throw.

Кад интерпретер наи?е на throw, прекида се извршава?е одговара?у?ег програмског блока.

На пример: n| if not n throw :element_nil end sum += n p sum end end

Ако извршимо ова? програмски кoд, он ?е резултирати следе?им исписом:

1
3
6

Испис показу?е да се пет?а извршила само за прва три члана низа. Кад ?е пет?а наишла на четврти цлан низа ци?а ?е вредност нил, што одговара логичко? вредности false, извршио се метод throw и прекинуло се извршава?е целог блока.

Модули [ уреди | уреди извор ]

Кориш?е?е више датотека [ уреди | уреди извор ]

Програмски кoд могу?е ?е поделити у више датотека (file). За ук?учива?е кода из додатних датотека користимо require.

На пример:

  require 'datoteka1'
  require 'datoteka2'

Тако?е, интерпретер не?е приликом покрета?а учитати све класе ко?е су посто?е у програмском ?езику Руби него само основне. Стога за ук?учива?е додатних класа тако?е морамо користити наредбу require.

На пример, наредба require 'pathname' учита?е класу Pathname и омогу?ити ?ено кориш?е?е.

Дефиниса?е модула [ уреди | уреди извор ]

Модул ?е изоловани кoд ко?и се може користити у више апликаци?а. Модули омогу?ава?у груписа?е метода, класа и константи у ?едну целину.

Креира?емо модул ко?и садржи функци?у за прерачунава?е брзине задате у метрима у секунди у километре на сат:

 module Brzina
    def self.konverzija metara_u_sekundi
         metara_u_sekundi * 3.6
    end
 end

Сада можемо позвати нову функци?у:

 Brzina.konverzija 10

Испис:

36.0

Примери [ уреди | уреди извор ]

Класични ?Поздрав Свету":

puts
 "Hello World!"

Референце [ уреди | уреди извор ]

Литература [ уреди | уреди извор ]

Спо?аш?е везе [ уреди | уреди извор ]