Даведнік па Ruby

TODO

Awesome Ruby – a collection of awesome Ruby libraries, tools, frameworks and software.

Five Ruby Methods You Should Be Using

Карысныя спасылкі

http://www.ruby-lang.org

http://ruby-doc.org – афіцыйная старонка, на якой сабраныя спасылкі да рознага кшталту дакумэнтацыі і літаратуры.

Ядро мовы (вэр. 2.1.1): http://ruby-doc.org/core

Стандартная бібліятэка (StdLib): http://www.ruby-doc.org/stdlib

Інтэрактыўная шпаргалка на OverAPI: http://overapi.com/ruby/

Стыль аздабленьня коду ад GitHub: https://github.com/styleguide/ruby

Ruby user's guide

Core Ruby Programming

Poignant-guide – сьцёбны, арыгінальны, але прыдатны толькі для першапачатковага паглыбленьня ў мову вучэбнік.

Learn Ruby The Hard Way

Programming Ruby – электронны варыянт першага выданьня адпаведнай кнігі ад The Pragmatic Programmers.

The Ruby Programming Language (першае выданьне папяровай кнігі, напісанай Дэвідам Флэнэгэнам і Юкіхіро Мацумото ад выдавецтва O'Reilly – на мой погляд лепшая крыніца, з тых што мне трапляліся, паглыбленага вывучэньня Ruby, але на жаль электроннага варыянту няма ў вольным доступе).

Курс на codecademy.com: http://www.codecademy.com/tracks/ruby

Інтэрактыўныя ўрокі для пачаткоўцаў на LearnStreet.com: http://www.learnstreet.com/lessons/study/ruby

Сэрыя курсаў на rubymonk.com

Апошнія Ruby & Rails навіны на envylabs.com: http://ruby5.envylabs.com/

Functional Ruby, Code Beauty, and Ruby Internals – RubyLove

Хатняя старонка: http://rubygems.org

Як шукаць і ўсталёўваць бібліятэкі: http://www.ruby-lang.org/en/libraries

Bundler: http://gembundler.com

Вэрсіі Ruby

Перад тым, як перайсьці да разгляду самой мовы, спынімся на гісторыі зьменаў яе вэрсіяў.

Гісторыя

Вэрсія Выхад Закрыцьцё Асаблівасьць
Major Minor
1.8 08.2003 06.2013 Гэта была ня першая вэрсія, але тая, якая прыйшлася на пачатак росту папулярнасьці Ruby. На дадзены момант яна аб'яўлена не пажаданай да выкарыстаньня і больш не падтрымліваецца.
1.8.1 12.2003 Пераважна фікс багаў
1.8.2 12.2004 Пераважна фікс багаў
1.8.3 09.2005 Пераважна фікс багаў
1.8.4 12.2005 Пераважна фікс багаў
1.8.5 08.2006 Пераважна фікс багаў
1.8.6 03.2007 Пераважна фікс багаў
1.8.7 05.2008 Фікс багаў, перанос некаторых паляпшэньняў, якія плянаваліся для 1.9, паляпшэньне прадукцыйнасьці.
1.9 12.2007 Прынцыпова новая, палепшаная вэрсія, якая не мела зваротнай сумяшчальнасьці з вэрсіяй 1.8. Зьмены ў сэмантыцы, у ядры мовы, у базавых клясах. Вэрсія 1.9.0 не зьяўлялася стабільным рэлізам, але толькі рэліз-кандыдатам.
1.9.1 01.2009 Пераважна фікс багаў у параўнаньні з 1.9.0. Першы стабільны рэліз вэрсіі 1.9.
1.9.2 08.2010 Шмат новых мэтадаў, новы Socket API, новыя кадоўкі, новая кляса Random, кляса Time перапрацавана, і іншае
1.9.3 10.2011 Шмат новых і палепшаных мэтадаў
2.0 2.0.0 02.2013 Шмат новых асаблівасьцяў і паляпшэньняў.
2.1 2.1.0 12.2013 Пераважна паляпшэньне прадукцыйнасьці
2.1.1 02.2014 Пераважна фікс багаў і паляпшэньне прадукцыйнасьці

Кіраваньне вэрсіямі (RVM)

З улікам таго, што новыя вэрсіі зьяўляюцца прыкладна раз на год, складана сабе ўявіць, што пры распрацоўцы нейкага праекту можна абысьціся адной вэрсіяй Ruby. Гэта магчыма хіба толькі для вельмі маленькіх праектаў, якія магчыма ад пачатку да канчатковага рэлізу распрацаваць за тэрмін да году. У астатніх выпадках, верагодней за ўсё, трэба будзе пачынаць з адной вэрсіі, а потым адаптаваць праграму пад іншую(-ыя). Яшчэ ў больш складанай сытуацыі будзе знаходзіцца распрацоўшчык, якому адначасова трэба працаваць на розныя праекты, якія высоўваюць адрозныя патрабаваньні што да вэрсіі Ruby. Ствараць асобныя віртуальныя машыны пад кожны з праектаў з сваім спэцыфічным асяродзьдзем, мякка кажучы ня вельмі зручна. І тут прыходзіць на дапамогу незаменнае прыстасаваньне пад назвай Ruby Version Manager (альбо скарочана RVM).

Усталяваньне RVM

Каб усталяваць RVM трэба запусьціць каманду:

Больш падрабязна пра розныя опцыі ўсталяваньня можна паглядзець тут.

Дзе RVM захоўвае якія даныя
Тэчка Прызначэньне
~/.rvm Хатняя тэчка RVM
~/.rvm/rubies Тэчка з усталяванымі вэрсіямі Ruby
~/.rvm/gems Тэчка з усталяванымі наборамі гемаў для кожнай з вэрсіі Ruby
~/.rvm/gemsets Тэчка наладак кожнага з набору гемаў

Абнаўленьне RVM

Калі пройдзе пэўны час, як вы ўжо працуеце з RVM, можа выйсьці новая альбо нават некалькі новых вэрсіяў прылады. Абнавіцца да новай вэрсіі можна пры дапамозе каманд:

Сьпіс даступных вэрсіяў

Каб даведацца якія вэрсіі Ruby можа ўсталяваць RVM, трэба скарыстацца камандай:

Усталяваньне новых вэрсіяў

Каб усталяваць у сыстэму новую вэрсію Ruby, трэба скарыстацца камандай:

Выдаленьне ўсталяваных вэрсіяў

Каб выдаліць раней усталяваную вэрсію Ruby, трэба скарыстацца камандай:

Сьпіс усталяваных вэрсіяў

Каб даведацца якія вэрсіі Ruby ужо ўсталяваныя RVM, трэба скарыстацца камандамі:

Выбар вэрсіі для працы

Цяпер, калі мы ўсталявалі некалькі вэрсіяў Ruby, нам трэба выбраць патрэбную ў дадзены момант для працы:

Множныя працоўныя асяродкі

Акрамя множных вэрсіяў самога Ruby, RVM таксама дазваляе ўсталёўваць множныя працоўныя асяродкі для адной і той жа вэрсіі. Па-ангельску ў тэрміланёгіі RVM яны завуцца ляканічна gemsets. Калі RVM усталёўвае новую вэрсію Ruby, ён стварае два змоўчных асяродка – global і default.

  • global – гэта супэр-асяродак, які спадкуюць усе астатнія асяродкі дадзенай вэрсіі Ruby.
  • default – гэта змоўчны асяродак, які выкарыстоўваецца ў выпадку, калі карыстальнік не абраў асяродку яўным чынам.

Зьмест гэтых асяродкаў, то бок набор якіх гемаў павіенен для іх ужывацца, утрымліваецца ў тэкставых файлах, якія карыстальнік можа ўручную рэдагаваць:

  • ~/.rvm/gemsets/ruby/1.9.3/global.gems
  • ~/.rvm/gemsets/ruby/1.9.3/default.gems

Напрыклад, калі дадаць наступны зьмест у файл ~/.rvm/gemsets/ruby/1.9.3/global.gems:

Тады, кожны раз, калі ствараецца новы асяродак для Ruby вэрсіі 1.9.3, гэтыя 2 гемы будуць аўтаматычна ўсталяваны ў гэты новы асяродак.

Прывядзем шэраг камандаў для працы з асяродкамі (gemsets):

Што такое Ruby?

Аб'ектна-арыентаваная мова

Ruby зьяўляецца цалкам аб'ектна-арыентаванай мовай праграмаваньня ў клясычным выглядзе. Усё, чым апэрыруе праграма на Ruby, зьяўляецца аб'ектам, і вынікі гэтых апэрацый таксама зьяўляюцца аб'ектамі. Аб'ектна-арыентаванае праграмаваньне характаразуецца тым, што распрацоўшчык спрабуе смадэляваць аб'ект рэальнага сьвету (возьмем у прыклад песьню) ў кодзе. У Ruby гэтыя аб'екты прадстаўляюцца клясамі. Клясы ўяўляюць зь сябе камбінацыю з стану (напр., назва песьні) і мэтадаў, якія апэрыруюць гэтым станам (напр., мэтад, каторы прайграе песьню).

Калі аб'ект смадэляваны і адпаведная кляса напісаная, можна ствараць экзэмпляры гэтай клясы. Гэта адбываецца праз выклік канструктара – адмысловага мэтаду клясы, які звычайна называецца new.

Абедзьве зьменныя song1 і song2 зьяўляюцца экзэплярамі адной і той жа клясы Song, але маюць унікальныя характарыстыкі. Па-першае, кожны аб'ект (экзэмпляр нейкай клясы) у Ruby мае ўнікальны ідэнтыфікатар (object id). Па-другое, кляса можа ўтрымліваць зьменныя экзэмпляру, якія будуць утрымліваць унікальныя для кожнага экзэмпляру значэньні. Гэтыя зьменныя і выражаюць пазначаны вышэй стан аб'екта. Напрыклад, кляса Song можа ўтрымліваць зьменную, якая захоўвае назву песьні.

Акрамя гэтага кожная кляса можа вызначаць мэтады экзэмпляраў – пэўны функцыянал, каторы можа выклікацца як знутры клясы, так і, пры пэўных акалічнасьцях, – звонку. Гэтыя мэтады маюць доступ да зьменных экзэмпляраў і могуць маніпуляваць імі. Мэтады могуць таксама называцца паведамленьнямі ці запытамі да аб'екта.

Тое, што стаіць да кропкі, называецца атрымальнікам паведамленьня/запыту. Пасьля кропкі ідзе мэтад, які павінен быць выкліканы. Першы з прыкладаў вышэй пытаецца пра даўжыню (мэтад length) радка («gin joint»). У другім прыкладзе ў іншага радка пытаецца пра індэкс літары «c» у ім. У трэцім прыкладзе мы пытаемся ў лічбы пра яе абсалютнае значэньне, а ў чацьвёртым просім sam’а, каб ён прапеў (мэтад play) нам песьню (перададзены ў якасьці парамэтру аб'ект aSong).

Інтуітыўная натацыя

Ruby створаны такім чынам, каб код, напісаны на ім, быў інтуітыўна зразумелы. Напрыклад, наступны выраз:

азначае «пяць (5) разоў (анг. times) надрукуй (анг. print) "Odelay!"». А выраз:

азначае, што «праграмма павінна скончыць сваё дзеяньне (анг. exit), калі радок "restaurant" не (анг. unless) утрымлівае (анг. include) радок "aura"». А выраз:

азначае «з кожным (анг. each) словам 'toast', 'cheese', 'wine' зрабіць наступнае: пачатковую літару зрабіць вялікай (анг. capitalize) і надрукаваць вынік (анг. print)».

Структура і выкананьне

Лексычная структура

Інтэрпрэтатар Ruby разьбірае ўвесь тэкст Ruby-праграмы на лексэмы (ці tokens). Лексэмы ўключаюць камэнтары, літаралы, пунктуацыю, ідэнтыфікатары і ключавыя словы. Разгледзім больш падрабязна кожную з гэтых групаў, а таксама зь якіх сымбаляў яны складаюцца.

Камэнтары

Камэнтары ў Ruby пачынаюцца са знака # і працягваюцца да канца радку. Сам знак # і ўсё, што ідзе за ім, ігнаруецца інтэрпрэтатарам. Калі знак # сустракаецца ў сымбальнай чарадзе альбо ў рэгулярным выразе, тады ён зьяўляецца часткай чарады ці рэгулярнага выразу і не пачынае камэнтар.

Камэнтары на шмат радкоў робяцца праз зьмяшчэньне знаку # у пачатку кожнага радку:

У Ruby няма эквіваленту ўнутрырадковага C-падобнага камэнтару: /*...*/.

Убудаваныя дакумэнты

Ruby падтрымлівае яшчэ адзін спосаб рабіць шматрадковыя камэнтары, які завецца убудаваныя дакумэнты (embedded documents). Такі камэнтар пачынаецца радком, які ў самым сваім пачатку зьмяшчае =begin, а сканчаецца радком, які ў самым сваім пачатку зьмяшчае =end:

Камэнтары для дакумэнтацыі павінны зьмяшчацца непасрэдна перад модулем, клясай альбо мэтадам, які яны апісваюць, і маюць адмысловыя правілы фарматаваньня, некаторыя зь якіх глядзі ў прыкладзе:

Прычым знак роўнасьці абавязкова павінен быць першым знакам адпаведных радкоў. Як вынікае з назвы гэтыя камэнтары прызначаны ў тым ліку для ўстаўкі вялікіх фрагмэнтаў дакумэнтацыі альбо для ўбудаваньня фрагмэнтаў зь іншых моваў праграмаваньня (як HTML альбо SQL). Гэтыя ўбудаваныя дакумэнты звычайна прызначаныя для апрацоўкі староньнімі прыладамі ці дадаткамі, якія апрацоўваюць зыходны код Ruby, а пасьля лексэмы =begin звычайна пазначаецца ідэнтыфікатар, які кажа для якой прылады ці дадатку прызначаецца дакумэнт.

Камэнтары для дакумэнтацыі

У Ruby маецца магчымасьць вымаць камэнтары з тэксту праграмы, каб ствараць дакумэнтацыю па праграме. Спасылка на rdoc

Камэнтары для дакумэнтацыі павінны зьмяшчацца непасрэдна перад модулем, клясай альбо мэтадам, які яны апісваюць, і маюць адмысловыя правілы фарматаваньня, некаторыя зь якіх глядзі ў прыкладзе:

Літаралы

Літаралы – гэта значэньні, якія сустракаюцца непасрэдна ў тэксьце праграмы. Гэта ўключае лікі, сымбальныя чароды і рэгулярныя выразы. (Іншыя літаралы, як масівы альбо хэшы, не зьяўляюцца асобнымі лексэмамі, але зьяўляюцца больш складанымі выразамі.) Сынтакс лічбавых і сымбальных літаралаў у Ruby насамрэч даволі складаны (глядзі разьдзел ....), але на дадзеным этапе дастаткова атрымаць спрошчанае іх разуменьне:

Пунктуацыя

У гэтую групу ўваходзяць ня толькі самі знакі пунктуацыі, як коска, кропка, двукроп'е і іншыя, якія служаць для групаваньня альбо аддзяленьня выразаў, аргумэнтаў мэтадаў, індэксаў масіваў, а таксама для абмежаваньня сымбальных чародаў, рэгулярных выразаў і іншага. Уваходзяць сюды і розныя знакі апэрацыяў.

Ідэнтыфікатары

Ідэнтыфікатар – гэта інакш імя. Ruby выкарыстоўвае ідэнтыфікатары, каб даваць імёны зьменным, мэтадам, клясам і іншаму. Яны могуць складацца з літараў, лічбаў і знаку падкрэсьліваньня, пры гэтым у якасьці яго першага сымбалю ня можа быць лічба. Калі ідэнтыфікатар пачынаецца з вялікай літары, інтэрпрэтатар Ruby аўтаматычна ўспрыме яго за імя канстанты. Ніжэй прыводзяцца прыклады розных ідэнтыфікатараў:

Па дамоўленасьці, калі ідэнтыфікатар (не канстанта) складаецца зь некалькіх словаў, тады паміж словамі зьмяшчаецца знак падкрэсьліваньня: like_this, а канстанты запісваюцца так: LikeThis, альбо так: LIKE_THIS.

Як можна было зразумець з вышэйсказанага, у Ruby малыя і вялікія літары маюць адрозьненьне. Напрыклад, ключавое слова end гэта ня тое ж самае, што ключавое слова END.

Пунктуацыя ў ідэнтыфікатарах

У пачатку ці ў канцы ідэнтыфікатараў могуць стаяць знакі пунктуацыі (альбо адмысловыя сымбалі), якія маюць наступнае значэньне:

$ Глябальныя зьменныя маюць прэфікс у выглядзе знаку даляру. Ruby вызначае шэраг глябальных зьменных, у якіх дадаткова прысутнічаюць яшчэ іншыя знакі, як $_ альбо $-. Па поўны сьпіс прадвызначаных адмысловых глябальных зьменных глядзі разьдзел 10.2.3.
@ Зьменныя экзэмпляру клясы маюць прэфікс у выглядзе адзіночнага at-знаку, а зьменныя клясы – у выглядзе падвойнага at-знаку. Па больш дэталёвую інфармацыю глядзі разьдзел 7.3.5, 7.3.6.
? Па дамоўленасьці імёны мэтадаў, якія вяртаюць значэньні Boolean, сканчаюцца пытальнікам.
! Па дамоўленасьці імёны мэтадаў, якія павінны ўжывацца з асьцярогаю, сканчаюцца клічнікам. Такім чынам адзначаюцца мэтады, якія зьмяняюць стан аб'екту, у якога яны былі выкліканыя. У адрозьненьне ад тых мэтадаў, якія вяртаюць зьмененую копію зыходнага аб'екту.
= Па дамоўленасьці імёны мэтадаў, якія прызначаны для прысваеньня значэньняў, сканчаюцца знакам роўнасьці.

Вось прыклады ідэнтыфікатараў, якія ўтрымліваюць гэтыя адмысловыя знакі:

Заўважце таксама, што некаторыя апэрацыі Ruby рэалізаваныя як мэтады, каб клясы маглі перавызначаць іх пад свае ўласныя патрэбы.

Ключавыя словы

Наступныя ключавыя словы маюць адмысловае значэньне ў Ruby і будуць асаблівым чынам апрацаваныя яго парсэрам:

__LINE__ begin else in rescue undef
__ENCODING__ break elsif module retry unless
__FILE__ case end next return until
BEGIN class ensure nil self when
END def false not super while
alias defined? for or then yield
and do if redo true

У дапаўненьне маюцца яшчэ 3 лексэмы, падобныя да ключавых словаў:

=begin =end __END__

2 зь якіх =begin і =end ужо згадваліся вышэй – яны адкрываюць і закрываюць так званыя убудаваныя дакумэнты (альбо шматрадковыя камэнтары). А лексэма __END__ пазначае канец праграмы (і пачатак сэкцыі з данымі), калі яна зьмяшчаецца ў самым пачатку радку, прычым пасьля яе на гэтым радку таксама нічога не павінна зьмяшчацца, нават прагалы.

Акрамя вышэйазначанага шмат важных асаблівасьцяў і магчымасьцяў Ruby рэалізаваныя як мэтады клясаў Kernel, Module, Class і Object. Такім чынам, добрай практыкай будзе падыход, пры якім яны лічацца таксама зарэзэрваванымі словамі з асаблівым сэнсам і не выкарыстоўваюцца для ўласнага найменьня:

Гэта мэтады, якія выглядаюць як выразы ці ключавыя словы
at_exit attr_reader include loop protected require
attr attr_writer lambda private public throw
attr_accessor catch load proc raise
Гэта найбольш ужываныя глябальныя мэтады
Array block_given? exit iterator? readline sub!
Float callcc exit! load readlines syscall
Integer caller fail open scan system
String chomp fork p select test
URI chomp! format print sleep trap
abort chop getc printf split warn
autoload chop! gets putc sprintf
autoload? eval gsub puts srand
binding exec gsub! rand sub
А гэта найбольш ужываныя мэтады аб'ектаў
allocate equal? inherited methods superclass untaint
clone extend inspect new taint
display freeze instance_of? nil? tainted?
dup frozen? is_a? object_id to_a
enum_for hash kind_of? respond_to? to_enum
eql? id method send to_s

Прагалы

Прагалы, знакі табуляцыі, пераносы радку – усе яны не зьяўляюцца лексэмамі, але падзяляюць лексэмы адну ад другой, якія б інакш зьліліся ў адну лексэму. Акрамя гэтай функцыі ў агульным выпадку прагалы ігнаруюцца інтэрпрэтатарам, але некаторыя зь іх выконваюць яшчэ дадатковыя, пры гэтым важныя функцыі. Ruby мае выразную, але і складаную граматыку, і існуюць выпадкі, калі ўстаўка ці выдаленьне некаторых відаў прагалаў можа зьмяніць сэнс праграмы. Хаця гэтых выпадкаў і ня шмат, іх трэба ведаць.

Пераносы радку

Найбольш важная залежнасьць ад прагалаў – гэта пераносы радку ў якасьці маркераў канца выразаў. У мовах праграмаваньня як C ці Java кожны выраз павінен сканчацца кропкай з коскай. Гэтак жа можна рабіць і ў Ruby, але гэта абавязкова толькі ў выпадку, калі патрэбна зьмясьціць некалькі выразаў у адным радку. Інакш, па дамоўленасьці, кропка з коскай не павінна ўжывацца. Але без кропкі з коскай інтэрпрэтатар павінен сам нейкім чынам зразумець дзе знаходзіцца канец выразу. Таму, калі фрагмэнт коду на адным радку можа быць сынтаксічна завершаным выразам, Ruby трактуе знак пераносу радку як азнаку канца выразу. Інакш ён працягвае аналізаваць код на наступным радку.

Калі кожны выраз зьмяшчаецца на асобным радку, тады ня ўзьнікне праблемаў, але калі ёсьць выразы, якія займаюць больш аднаго радку, трэба зрабіць перанос выразу такім чынам, каб Ruby ня здолеў інтэрпрэтаваць фрагмэнт на першым з гэтых радкоў як асобны выраз. Напрыклад, наступны код складзе x з y і назначыць суму зьменнай total:

А вось наступны код назначыць значэньне зьменнай x зьменнай total, а потым вылічыць значэньне зьменнай y і нічога з гэтым ня зробіць:

Сынтаксычная структура

Вышэй мы разглядалі лексэмы – элемэнтарныя цаглінкі Ruby-праграмы. Зараз коратка разгледзім як гэтыя цагліны складаюцца разам у большыя, сынтаксычныя структуры Ruby-праграмы – ад прасьцейшых выразаў да буйных модуляў.

  1. Базавым элемэнтам сынтаксу ў Ruby зьяўляецца выраз. Інтэрпрэтатар Ruby апрацоўвае выразы і атрымлівае ў выніку значэньні. Самымі простымі зьяўляюцца прымітыўныя выразы, якія прадстаўляюць значэньні наўпрост – лікі, сымбальныя чароды, зьменныя (якія дасылаюць наўпрост да пэўнага значэньня) і некаторыя ключавыя словы, якія прадстаўляюць адмысловыя значэньні (true, false,nil, self). Акрамя гэтага існуюць і больш складаныя, састаўныя выразы:

    Апэрацыі прызначаныя для выкананьня вылічэньняў са значэньнямі. Састаўныя выразы складаюцца ў тым ліку пры дапамозе камбінаваньня апэрацыяў зь іншымі выразамі:

  2. Выразы ў камбінацыі з ключавымі словамі могуць утвараць інструкцыі для выкананьня, альбо апэратары1. Гэтак, if-апэратар выкарыстоўваецца для ўмоўнага выкананьня пэўнага коду, а while-апэратар – для цыклічнага выкананьня коду:




    У Ruby інструкцыі (апэратары) тэхнічна таксама зьяўляюцца выразамі і вяртаюць значэньні, хаця ня ўсе зь іх зьяўляюцца асэнсаванымі – напрыклад, while-апэратар заўсёды вяртае значэньне nil.

  3. Амаль заўсёды маецца неабходнасьць згрупаваць выразы і інструкцыі ў адасобленыя адзінкі з уваходнымі парамэтрамі, каб іх можна было выклікаць шматкроць і са зьменлівымі ўваходнымі данымі. У Ruby, як аб'екта-арыентаванай мове, гэтыя адзінкі завуцца мэтадамі. Акрамя гэтага маюцца мэтад-падобныя адзінкі працэдуры і лямбды.

  4. І напрыканцы ўзаемазьвязаныя мэтады могуць аб'ядноўвацца ў клясы, а клясы і асобныя мэтады могуць аб'ядноўвацца ў модулі.

Групаваньне зьместу праз блёкі

Праграмы на Ruby маюць блёчную структуру, у тым сэнсе, што модулі, клясы, мэтады і большасьць інструкцыяў маюць блёкі злучанага зь імі коду. Існуе 2 тыпы блёкаў. Па-першае, гэта блёкі, які перадаюцца ітэрацыйным мэтадам. Яны могуць заключацца альбо ў фігурныя дужкі (калі укладзеныя выразы зьмяшчаюцца на адзіна радок), альбо паміж ключавымі словамі doend (шматрадковы блёк):

Іншым тыпам блёкаў зьяўляюцца целы модуляў, клясаў, мэтадаў і апэратараў. Яны ніколі не заключаюцца ў фігурныя дужкі, але пры дапамозе ключавых словаў. Таксама блёкі могуць быць укладзеныя адны ў іншыя:

Структура файлаў

Кадоўка файлаў

Выкананьне праграмы

Выразы і апэрацыі

Сынтакс Ruby цэнтруецца вакол выразаў. Напрыклад, элемэнты кіраваньня плыньню праграмы, кшталту if у любой іншай мове праграмаваньня называюцца апэратарамі (умоўным апэратарам у дадзеным выпадку), а ў Ruby гэта таксама выразы і яны вяртаюць значэньні:

Хаця ня ўсе зь іх вяртаюць зьмястоўныя значэньні. Напрыклад, апэратар цыкла while ці вызначэньне мэтаду вяртаюць nil.

Літаралы

Зьменныя

Зьменныя — гэта імёны аб’ектаў ці значэньняў. Яны могуць састаяць з літараў, лічбаў і знака падкрэсьліваньня. Прыклад:

УВАГА! Зьменныя больш нізкага ўзроўню ня проста перакрываюць зьменныя з тым жа імем больш высокага ўзроўню (як, напрыклад, у Java):

але перавызначаць/заціраюць яе:

Як бачым, у апошнім радку ў якасьці значэньня зьменнай verb больш высокага ўзроўню падставіцца "electrocuted" — апошняе значэньне ітэратару, а не першапачатковае "rescued", як магло б падацца.

Спроба зьвярнуцца да яшчэ не аб'яўленай зьменнай выкліча памылку, але тут ёсьць адзін «хітрык» — дастаткова каб інтэпрэтатар Ruby «убачыў» аб'яўленьне зьменнай і не абавязкова, каб гэта аб'яўленьне выканалась праграмай:

Зьменныя экзэмпляраў

Зьменныя, каторыя пачынаюцца са знака @, зьяўляюцца зьменнымі экзэмпляраў клясаў:

Яны пазначаюць характарыстыку гэтага асабістага экзэмпляру. Напрыклад, каб пазначыць шырыню ўваходных дзьвярэй трэба ўвесьці зьменную @width у экзэмпляр front_door клясы Door.

Зьменныя клясаў

Зьменныя яшчэ больш высокага ўзроўню (у параўнаньні зь лякальнымі і экзэплярнымі) — зьменныя клясаў. Яны пачынаюцца з падвойнага знака @:

І пазначаюць характарыстыку ўсёй клясы (усіх экзэмпляраў гэтай клясы). Зьяўляюцца аналягамі статычных зьменных у Java.

Глябальныя зьменныя

Ну і зьменнымі найбольш высокага ўзроўню зьяўляюцца глябальныя зьменныя. Яны пачынаюцца са знака $ і даступны зь любога месца праграмы:

Канстанты

Канстанты як зьменныя, але пачынаюцца зь вялікай літары і не павінны зьмяняць сваё значэньня цягам працы праграмы. Хаця апошняе строга не забаронена — пры зьмене значэньня канстанты інтэрпрэтатар Ruby выдасьць толькі папярэджаньне. Акрамя гэтага ёсьць яшчэ адна асаблівасьць — імя канстант вядзецца запісваць ня проста зь вялікай літары, а ўсімі вялікімі літарамі:

Канстанта можа быць вызначана як на глябальным узроўні (global scope), так і на ўзроўні клясаў ці модуляў:

Апэрацыі

Апэрацыі выкарыстоўваюцца ў праграме для выкананьня матэматычных і лягічных апэрацый, для параўнаньня і інш. Шмат зь іх рэалізваныя праз мэтады, і клясы могуць вызначаць (ці перавызначаць) іх на свой капыл. Напрыклад, апэрацыі + і * дзейнічаюць па-рознаму для лікаў і сымбальных чародаў. А ўва ўласных варыянтах гэтых клясаў можна ўвогуле вызначыць свае варыянты гэтых мэтадаў. Іншы прыклад, каторы ілюструе гэты падыход — апэрацыя <<. Лікавыя клясы Fixnum і Bignum рэалізуюць яе для бітавага зруху ўлева, у той час як іншыя клясы (сымбальныя чароды, масівы) рэалізуюць яе як дадаваньне зьместу.

Унарныя + і -

Унарная апэрацыя -, каторая зьмяшчаецца перад лікам, зьмяняе яго знак на адваротны. Унарны + перад лікам таксама дазваляецца, але ён не аказвае ніякага ўзьдзеяньня. Каб адрозьніваць гэтыя апэрацыя ад адпаведных арытмэтычных, мэтады, якія вызначаюць гэтыя апэрацыі, маюць назвы -@ і +@.

Cтупеняваньне: **

Апэрацыя ** падвышае першы аргумэнт у ступень другога. Другі аргумэнт можа быць дробавым (кубічны корань ад x: x**(1.0/3.0)), а таксама адмоўным (x**-y эквівалентна 1/(x**y)).

Арытмэтычныя: +, -, *, / і %

Апэрацыя +, -, * і / выконваюць адпаведна арытмэтычнае складаньне, адніманьне, памнажэньне і дзяленьне сваіх лікавых аргумэнтаў. Цэлалікавае дзяленьне дае заўсёды цэлалікавы вынік, а астача адкідваецца. Астачу цэлалікавага дзяленьня можна вызначыць пры дапамозе апэрацыі %.

Сымбальныя чароды выкарыстоўваюць апэрацыю + для спалучэньня некалькіх чародаў, апэрацыю * для паўтарэньня чародаў і апэрацыю % у якасьці аргумэнту мэтаду sprintf.

У выпадку масіваў апэрацыя + спалучае масівы, апэрацыя - аднімае масівы. Паводзіны апэрацыі * залежаць ад другога аргумэнту. Калі другім аргумэнтам зьяўляецца лік, тады у выніку атрымліваецца іншы масіў, у каторым першапачатковы паўтараецца столькі разоў, як гэты лік. Калі ж другі аргумэнт — сымбальная чарада, тады гэтая апэрацыя эквівалентна мэтаду join.

Зрух і дадаваньне: << і >>

Апэрацыі << і >> у выпадку лікавых апэрандаў робяць бітавы зрух першага апэранду адпаведна ўлева і ўправа на колькасьць бітаў, пазначаных другім апэрандам.

У выпадку сымбальных чародаў і масіваў апэрацыя << дадае да левага свайго апэранду зьмест правага апэранду:

Бітавыя: ~, &, | і ^

Лягічныя пабітавыя апэрацыі (адпаведна) NOT, AND, OR і XOR.

Параўнаньне: >, >=, <, <= і <=>

Апэрацыі праверкі ці першы аргумэнт (адпаведна) большы за другі, большы альбо роўны другому, меншы другога, меншы альбо роўны другому. Апошняя з гэтых апэрацыяў (<=>) мае трохі адрознае значэньне. Гэта ўнівэрсальная апэрацыя параўнаньня: калі левы апэранд меньшы за правы, яна вяртае -1, калі левы апэранд большы за правы, яна вяртае 1, і калі яны роўныя, вяртае 0.

Роўнасьць: ==, !=, =~, !~ і ===

Апэрацыя == правярае ці яе апэранды «роўныя» (у разуменьні левага апэранду). Апэрацыя != вяртае супрацьлеглае значэньне апэрацыі ==.

Апэрацыя =~ правярае ці сымбальная чарада адпавядае шаблёну (Regexp), а апэрацыя !~ робіць адваротнае.

Апэрацыя === правярае ці ўваходзіць пэўнае значэньне ў пазначаны дыяпазон.

Лягічныя: &&, ||, !, and, or, not

Вынікам апэрацыі && будзе true, калі абодва яе аргумэнта маюць значэньне true, інакш вынікам будзе false. Вынікам апэрацыі || будзе true, калі хаця б адзін зь яе аргумэнтаў мае значэньне true, а вынікам false будзе толькі тады, калі абодва аргумэнта таксама маюць значэньне false. Апэрацыя ! робіць булеўскае адмаўленьне свайго адзінага аргумэнта, то бок вяртае false, калі аргумэнт мае значэньне true, і, наадварот, вяртае true, калі калі аргумэнт мае значэньне false.

Апэрацыі and, or і not зьяўляюцца меньш прыярытэтнымі эквівалентамі адпаведна апэрацый &&, || і !.

Дыяпазону: .. i ...

Гэтая апэрацыя служыць для стварэньня дыяпазонаў як аб'ектаў, дыяпазонных выразаў, а таксама ўмоўных дыяпазонаў.

Апэрацыя мае 2 варыянты: уключны (..) і выключны (...):

Умоўная: ?:

Гэта адзіная тэрнарная (мае 3 апэранда) апэрацыя ў Ruby. Першы апэранд зьмяшчаецца перад пытальнікам, другі — паміж пытальнікам і двукроп'ем, а трэці — пасьля двукроп'я. Апэрацыя спачатку вылічвае свой першы апэранд, калі ён ня роўны false ці nil, тады апэрацыя вяртае другі свой апэранд, у адваротным выпадку — свой трэці апэранд. Можна сказаць, што гэтая апэрацыя зьяўляецца кароткай формай ўмоўнага апэратара (if/then/else). Прыклады:

Праверка вызначэньня: defined?

Апэрацыя правярае ці вызначаны яе адзіны апэранд.

Прысваеньня

Апэрацыі прысваеньня звычайна даволі інтуітыўна зразумелыя, але што тычыцца гэтых апэрацыяў у Ruby, трэба спыніцца на некалькіх асаблівасьцях. Па-першае, значэньнем выразу прысваеньня зьяўляецца правы апэранд апэрацыі. Па-другое, апэрацыя прысваеньня зьяўляецца права-асацыятыўнай. Гэтыя дзьве асаблівасьці прыводзяць да таго, што выразы наступнага выгляду дазваляльныя ў Ruby:

Прысваеньне лякальным зьменным

Наступнай асаблівасьцю зьяўляецца той факт, што ў Ruby няма яўных мэханізмаў у сынтаксе адрозьніць зьменную ад мэтаду. Гэта прыводзіць да таго, што выраз x у Ruby можа зьвяртацца да аднайменнай лякальнай зьменнай, альбо да аднайменнага мэтаду. Каб вырашыць гэтую неадназначнасьць, Ruby трактуе такі выраз як зьвяртаньне да лякальнай зьменнай, калі да гэтага было прысваеньне гэтай зьменнай:

Прысваеньне атрыбутам і масівам

Прысваеньне атрыбутам і масівам у Ruby зьяўляецца на самай справе кароткай формай выклікаў адпаведных мэтадаў. Уявім, што аб'ект o мае аб'яўленьне мэтаду m=, тады выраз o.m можа зьяўляцца левым апэрандам апэрацыі прысваеньня:

Гэта прысваеньне інтэрпрэтатар Ruby пераўтворыць у выклік мэтаду:

Звычайна аб'яўленьне мэтаду m= ідзе ў пары з аб'яўленьнем мэтаду m, каторы проста вяртае значэньне, апошні раз перададзенае мэтаду m=. Калі аб'ект мае такую пару мэтадаў, кажуць, што аб'ект мае атрыбут m. Мэтад m= называюць пры гэтым setter, а мэтад m — getter.

Прысваеньне элемэнтам масіву таксама адбываецца праз выклік адпаведнага мэтаду. Калі аб'ект o мае аб'яўленьне мэтаду []=, каторы прымае 2 аргумэнты, тады выраз o[x] = y будзе на самай справе выкананы як:

Па аналёгіі, калі аб'ект o мае аб'яўленьне мэтаду []=, каторы прымае 3 аргумэнты, тады выраз o[x,y] = z будзе на самай справе выкананы як:

Скарочаныя формы прысваеньняў

Скарочаныя формы прысваеньняў камбінуюць прысваеньне з іншай апэрацыяй. Найбольш ужываныя з такіх прысваеньняў — гэта апэрацыі інкрымэнту і дэкрымэнту:

Яшчэ адна скарочаная форма, каторая ўжываецца часьцей за астатнія, гэта ||=. Яна звычайна ўжываецца ў выпадку, калі трэба зьвярнуцца да масіву ці хэшу, каторыя могуць быць яшчэ не ініцыялізаваны (роўныя nil):

Такі выраз прывядзе да таго, што калі results роўны nil, будзе выкананы правы апэранд булеўскай апэрацыі || і results будзе праініцыялізаваны пустым масівам. Інакш, калі ён ня роўны nil (то бок ужо праініцыялізваны раней), ён застанецца нязьменным.

Паралельныя прысваеньні

Гэта прысваеньні, у каторых альбо cправа, альбо зьлева, альбо і там, і там больш чым адзін апэранд. Гэтыя множныя апэранды падзяляюцца паміж сабой коскамі, і перад некаторымі зь іх можа стаяць зорачка (тлумачэньне будзе ніжэй).

Некаторыя варыянты такіх прысваеньняў даволі відавочныя, але ёсьць і складаныя. Таму разгледзем такія прысваеньні больш падрабязна:

Апэратары і кіруючыя структуры

Умоўнае выкананьне

Цыклі

Ітэратары і пералічэньні

Блёкі

Пэўны код, заключаны ў фігурныя дужкі альбо паміж ключавымі словамі do і end, называецца блёкам. Блёкі неабходны для групаваньня некалькіх інструкцыяў:

Блёкі можна асацыяваць з выклікамі мэтадаў. Такія мэтады могуць выклікаць тады гэтыя блёкі пры дапамозе ключавога слова yield:

У выніку будзе выведзена на экран:

Аргумэнты блёкаў і ітэратары

У блёкі могуць перадавацца аргумэнты. У гэтым выпадку яны зьмяшчаюцца ў самым пачатку блёку, заключаюцца ў знакі вертыкальных ліній і падзяляюцца коскамі:

У прыкладзе вышэй x і y — аргумэнты блёку, каторы ўтрымлівае адзіную інструкцыю — складаньне значэньняў гэтых аргумэнтаў.

Аргумэнты блёкаў актыўна выкарыстоўваюцца ў ітэратарах:

У выніку на экран будзе выведзена:

Зьмена нармальнай хады праграмы

Выключэньні і іх апрацоўка

Плыні і ніці

Мэтады, працэдуры, лямбды і замыканьні

Мэтады

Працэдуры і лямбды

Замыканьні

Клясы і модулі

Клясы

Модулі

Часткі мовы

Любая мова, у тым ліку і праграмаваньня, складаецца з пэўных частак. Разгледзім часткі, зь якіх складаецца Ruby.

Клясы

Мэтады

Functional Programming Techniques With Ruby

Як ужо пазначалася вышэй мэтады — гэта запыты да аб’ектаў. Каб зрабіць выклік мэтаду, пазначаецца зьменная ці канстанта, пасьля каторай ставіцца кропка і потым імя мэтаду:

Выклікі мэтадаў могуць ісьці адзін за адным, таму што, як мы памятаем, вынік мэтаду — гэта таксама аб’ект:

Гэты складаны выклік кажа ўваходным дзьвярам адчыніцца і адразу ж зачыніцца. Імёны мэтадаў могуць утрымліваць клічнікі і пытальнікі:

Некаторыя мэтады зьяўляюцца ядром мовы і могуць быць выкліканы без пазначэньня экзэмпляру, да каторага яны адносяцца:

Як гэта працуе? У Ruby на самым версе герархіі клясаў знаходзіцца кляса Object. Усе мэтады гэтай клясы, адпаведна, калі не перавызначыныя яўна, успадкоўваюцца ўсімі іншымі клясамі. Дык вось у Object дамешваецца модуль Kernel (kernel па ангельску азначае ядро). Адпаведна, усе мэтады ядра мовы даступны глябальна і без патрэбы пазначаць экземпляр нейкай клясы.

redo

Выклік redo у мэтадзе прыводзіць да яго ж выкліку яшчэ раз:

Калі ў выпадку выкліку LotteryTicket.new_random будуць згенерэны хаця б дзьве аднолькавыя лічбы, тады picks.uniq.length != 3 прывядзе да кіданьня памылкі, але rescue ArgumentError зловіць яе, а redo выкліча мэтад new_random яшчэ раз і гэта ўсё столькі разоў, пакуль усе 3 лічбы ня будуць унікальнымі.

Аргумэнты мэтадаў

Некаторыя мэтады патрабуюць дадатковую інфармацыю, каб выканаць свае дзеяньні. Гэтую інфармацыю ім перадаюць пры дапамозе аргумэнтаў, каторыя ідуць пасьля імені мэтаду, заключаюцца ў дужкі (не абавязкова) і падзяляюцца коскамі:

Калі перад аргумэнтам мэтаду стаіць зорачка, гэта азначае, што можа быць любая колькасьць фактычных парамэтраў мэтаду і яны будуць перададзеныя як масіў:

Мэтады клясаў

Мэтады клясаў (аналяг статычных мэтадаў у Java) гэта запыты да клясаў, а не іх экзэмпляраў. Выклік адбываецца праз пазначэньне імені клясы, за каторым ідзе падвойнае двукропье і потым імя мэтаду:

Атрыбуты

Уводзіць у клясу зьменныя a і b:

Уводзіць у клясу зьменныя a і b, а таксама getter- і setter-мэтады для ніх:

Уводзіць у клясу зьменныя a і b, а таксама getter-мэтады для ніх:

Уводзіць у клясу зьменныя a і b, а таксама setter-мэтады для ніх:

Пашырэньне

Любая кляса, нават базавая, можа быць пашыраная:

Папярэдні прыклад вывядзе ў кансоль Hello the World!

Стандартныя тыпы

Стандартныя тыпы, як лікі, радкі сымбаляў і інш. — гэта базавыя цаглінкі, з каторых будуецца Ruby-праграма.

Object

Object у Ruby зьяўляецца базавай для астатніх клясаў, каторыя ўскосна ўспадкоўваюць ад яе. Хаця сама знаходзіцца не ў самым версе герархіі клясаў, а зьяўляецца спадчыннай ад клясы BasicObject.

Мэтады

Разгледзем у гэтым разьдзеле асноўныя мэтады, каторыя вызначаюцца ў Object. Пры разглядзе іншых клясаў мэтады, прыведзеныя тут і сэнс каторых у тых клясах не зьмяняецца, рязглядацца ня будуць.

Вызначэньне ID аб’екта

Вызначэньне клясы аб’екта

Праверка прыналежнасьці да клясаў

instance_of? — строгая праверка прыналежнасьці аб’екта да пэўнай клясы (без уліку герархіі і ўключаных модуляў). kind_of? (альбо is_a?) — мяккая праверка прыналежнасьці аб’екта да клясы, то бок ня толькі непасрэднай клясы, але і ўсёй герархіі клясаў альбо ўключаных модуляў (гл. прыклад вышэй). Будзьце ўважлівымі тыя, хто пераходзіць да вывучэньня Ruby з Java. Той сэнс, каторы рэалізаваны яваўскім instance_of, у Ruby рэалізуецца мэтадам kind_of? (альбо is_a?), а не instance_of?.

Апэрацыі параўнаньня

Праверка на nil

Аб’ект, каторы нікуды не спасылаецца, ня проста "нішто", як напрыклад у Java, але пусты аб’ект, у каторага можна выклікаць пэўныя мэтады. Адным з такіх мэтадаў і зьяўляецца праверка на тое, пусты аб’ект ці не:

Кланаваньне

Мэтады clone і dup у Object падобны — яны капіруюць зьменныя аднаго экзэмпляру ў іншы. Пры гэтым капіруюцца спасылкі, а не значэньні. Але адрозьніваюцца яны тым, што мэтад clone акрамя гэтага капіруе яшчэ і frozen-стан экзэмпляру, а dup гэтага ня робіць.

Замарозка

Мэтад freeze прадухіляе аб’ект ад далейшых зьменаў.

Радковае прадстаўленьне аб’ектаў

Мэтад inspect вяртае радок, які ўтрымлівае чытэльнае чалавекам прадстаўленьне аб’екта. Мэтад to_s, вызначаны ў Object, вяртае імя клясы і ID аб’екта.

Мэтады інспэкцыі структуры клясы

Асобнай групай стаяць мэтады інспэкцыі структуры клясы — вызначэнье якія ёсьць у аб’екта зьменныя, мэтады і іншыя атрыбуты:

Лікі

Герархія ўбудаваных лікавых клясаў
Герархія ўбудаваных лікавых клясаў

Ruby утрымлівае 5 убудаваных клясаў для прадстаўленьня цэлых і рэчаісных лікаў (гл. схему).

Цэлыя

Цэлыя лікі (экзэмпляры базавай для ўсіх цэлых лічбаў клясы Integer) складаюцца з пасьлядоўнасьці лічбаў, перад каторымі можа стаяць знак плюсу ці мінусу:

У мэтах візуальнага падзяленьня тысячаў у ліках дазваляецца выкарыстоўваць знак падкрэсьліваньня:

Цэлыя могуць быць адвольнай дліны ці памеру (аж да значэньня, каторае абмежавана даступнай свабоднай памяцьцю кампутара). У межах пэўнага дыяпазону (звычайна ад -230 да 230-1 ці ад -262 да 262-1) цэлыя прадстаўляюцца як аб’екты клясы Fixnum — малыя цэлыя. Калі ж яны выходзяць за гэты дыяпазон, то Ruby пераводзіць іх у аб’екты клясы Bignum — вялікія цэлыя, і наадварот. Прычым гэты працэс пераводу лікаў з Fixnum у Bignum і наадварот — празрысты для распрацоўшчыка, Ruby робіць гэта сам:

У выніку на экран будзе выведзена:

Цэлыя могуць быць таксама запісаныя ў васьмірычным, шаснаццацірычным ці дваічным выглядзе:

Акрамя гэтага цэлы лік, як адлюстраваньне коду сымбалю, можна атрымаць паставіўшы знак пытальніку перад гэтым сымбалем:

Рэчаісныя

Рэчаісныя лікі (экзэмпляры клясы Float) складаюцца з пасьлядоўнасьці лічбаў і нефіксаванай кропкі ці навуковай натацыі:

Зьвярніце ўвагу, што пасьля нефіксаванай кропкі абавязкова павінна стаяць лічба:

Мэтады

Коратка пра мэтады, каторыя прадстаўляюцца лікамі (поўныя сьпісы і тлумачэньні даступныя па спасылкам зьлева):

Матэматычныя апэрацыі

Бінарныя апэрацыі

Апэрацыі параўнаньня

Праверкі адпавяданьня пэўнаму крытэру

Мэтады лікавых трасфармацый

Ітэратары

Мэтады трасфармацый у іншыя тыпы

Мэтады дзяленьня і знаходжаньня астачы

Асобна спынімся на мэтадах дзяленьня і знаходжаньня астачы (рэшты) ад цэлага дзяленьня. Заўважым, што мэтад divmod вяртае не адно, а масіў значэньняў. Прычым, калі q, r = x.divmod(y), тады:

Параўнаўчая табліца:

             a   |  b | a.divmod(b) | a.div(b), a/b | a.modulo(b), a%b | a.remainder(b)
           ------+----+-------------+---------------+------------------+---------------
            13   |  4 |   3,   1    |      3        |        1         |      1
           ------+----+-------------+---------------+------------------+---------------
            13   | -4 |  -4,  -3    |     -3        |       -3         |      1
           ------+----+-------------+---------------+------------------+---------------
           -13   |  4 |  -4,   3    |     -4        |        3         |     -1
           ------+----+-------------+---------------+------------------+---------------
           -13   | -4 |   3,  -1    |      3        |       -1         |     -1
           ------+----+-------------+---------------+------------------+---------------
            11.5 |  4 |   2,   3.5  |      2.875    |        3.5       |      3.5
           ------+----+-------------+---------------+------------------+---------------
            11.5 | -4 |  -3,  -0.5  |     -2.875    |       -0.5       |      3.5
           ------+----+-------------+---------------+------------------+---------------
           -11.5 |  4 |  -3,   0.5  |     -2.875    |        0.5       |     -3.5
           ------+----+-------------+---------------+------------------+---------------
           -11.5 | -4 |   2,  -3.5  |      2.875    |       -3.5       |     -3.5
        

Пералічэньне

Модуль Enumerable не зьяўляецца самастойнай клясай, але дамешкам да іншых клясаў, каб надаць ім уласьцівасьці калекцыяў аб'ектаў.

Мэтады

Коратка пра мэтады, каторыя прадстаўляюцца пералічэньнямі (поўны сьпіс і тлумачэньне даступныя па спасылцы зьлева).

Праверка элемэнтаў

Перабор элемэнтаў

Сымбальныя чароды

Сымбальныя чароды — гэта пасьлядоўнасьць любых сымбаляў (літараў, лічбаў, знакаў прыпынку), якія ўзяты ў апострафы ці двукосьсе. Уключаюць у сябе дамешак Enumerable.

У сымбальных чародах, каторыя ўзятыя ў адзіночныя апострафы, дазваляюцца простыя sequence-пасьлядоўнасьці:

У сымбальных чародах, ўзятых ў двукосьсе, дазваляецца большая колькасьць sequence-пасьлядоўнасьцяў (напр. "\n"). Акрамя гэтага ў такія чароды можна падставіць любы выраз пры дапамозе #{ }:

Каб пазначыць адзін сымбаль/знак (не чараду з аднаго знаку, а менавіта знак), перад ім ставіцца пытальнік:

Мэтады

Коратка пра мэтады, каторыя прадстаўляюцца чародамі (поўны сьпіс і тлумачэньне даступныя па спасылцы зьлева).

Памер чарады

Параўнаньне чародаў

Акрамя стандартных мэтадаў параўнаньня, у String яшчэ існуе мэтад параўнаньня чародаў аналягічны мэтаду <=>, але без уліку рэгістру літар:

Паэлемэнтны доступ

Акрамя формы а-ля масіў, прыведзенай у прыкладзе вышэй, можна яшчэ ўжываць мэтад slice — бязь зьмены зыходнай чарады, ці slice! — са зьменай зыходнай чарады.

Мадыфікацыя зьместу

Мадыфікацыя рэгістру літар

Паэлемэнтны перабор

Існуюць 4 мэтады: bytes, chars, codepoints і lines, а таксама іх аналягі з прэфіксам each_. Першыя чатыры, калі ім перадаецца блёк, аналягічныя апошнім чатыром. Калі ж яны выклікаюцца бяз блёку, то проста вяртаюць пералічэньне з байтаў, сымбаляў, кодаў ці радкоў адпаведна.

Разбор чарады

Кадоўка знакаў

Трансфармацыя ў іншыя тыпы

Масівы

Масівы — гэта пасьлядоўнасьць значэньняў (неабавязкова аднолькавага тыпу), доступ да каторых можна атрымаць па іх парадкаваму нумару (індэксу). Нумарацыя элемэнтаў ў масіве пачынаецца з нуля. Нумараваць элемэнты можна ў тым ліку з канца, у гэтым выпадку індэкс будзе мець негатыўнае значэньне (-1 адпавядае апошняму элемэнту, -2 — перадапошняму і г.д.). Масівы ўключаюць у сябе дамешак Enumerable

Мэтады

Коратка пра мэтады, уласьцівыя масівам (поўны сьпіс і тлумачэньне даступныя па спасылцы зьлева).

Агульнага прызначэньня

Stack / Queue

Асобна прывядзем мэтады масіваў, каторыя мадэлююць зь іх чэргі, стэкі і сьпісы. А спачатку дыяграма гэтых мэтадаў для нагляднага азнаямленьня:

Дыяграма стэкавых мэтадаў

Хэшы

Хэшы — гэта структуры даных, у каторых пэўным ключам пастаўлены ў адпаведнасьць іх значэньні (пару ключ/значэньне будзем называць вызначэньнем). Шэраг вызначэньняў заключаны паміж фігурнымі дужкамі, а вызначэньні ў гэтым шэрагу падзелены паміж сабой коскамі. Паміж ключом і яго значэньнем стаяць знакі =>:

Хэшы ўключаюць у сябе дамешак Enumerable.

У адрозьненьне ад масіваў значэньні хэшаў утрымліваюцца непасьлядоўна і доступ да іх адбываецца не па парадкаваму нумару, а па яго ключу.

Дыяпазоны

Дыяпазоны паўсюдна сустракаюцца ў штодзённым жыцьці: са студзеня па люты, ад 0 да 9, радкі з 57 па 60 і г.д. Ruby падтрымлівае гэтыя існасьці праз тып Range. Прычым у Ruby гэты тып выкарыстоўваецца для прадстаўленьня пасьлядоўнасьцей, умоваў і інтэрвалаў. Дыяпазоны ўключаюць у сябе дамешак Enumerable.

Як пасьлядоўнасьці

Найбольш натуральнае выкарыстаньне дыяпазонаў — для прадстаўленьня пасьлядоўнасьцяў. Запісваюцца яны праз пазначэньне пачатковага значэньня, потым ідзе апэрацыя дыяпазону, пасьля каторай пазначаецца канцавое значэньне пасьлядоўнасьці. Апэрацыя дыяпазону можа быць альбо .. (з уключэньнем апошняга пазначанага значэньня пасьлядоўнасьці), альбо ... (без уключэньня апошняга значэньня):

Унутрана дыяпазоны захоўваюцца ня ў выглядзе сьпісу з усіх значэньняў, а ў выглядзе пачатковага і канцавога значэньняў. Таму, каб атрымаць сьпіс значэньняў, трэба выклікаць мэтад to_a, каторы пераўтворыць дыяпазон у масіў усіх яго значэньняў:

Дыяпазоны можна ўтвараць ня толькі з лікаў ці сымбаляў, але і з любых іншых аб’ектаў. Але існуюць пэўныя патрабаваньні да клясаў, чые экзэмпляры могуць утвараць дыяпазоны: 1. утрымліваць дамешак Comparable і, адпаведна, правільна рэалізоўваць мэтад <=>; 2. рэалізоўваць мэтад succ, каторы вяртае наступны элемэнт у дыяпазоне:

Пасьля гэтага магчымае наступнае ўжываньне:

Як умовы

Акрамя пасьлядоўнасьцяў дыяпазоны ўжываюцца ў якасьці ўмоўных выразаў:

Як інтэрвалы

А яшчэ дыяпазоны ўжываюцца для праверкі ці ўваходзіць значэньне ў пэўны інтэрвал пры дапамозе апэрацыі ===:

Апэрацыя === яшчэ называецца case-параўнальнай, таму што выкарыстоўваецца ў аператары case, калі ў ім ужываюцца дыяпазоны:

Мэтады

Коратка пра мэтады, каторыя прадстаўляюцца дыяпазонамі (поўны сьпіс і тлумачэньне даступныя па спасылцы зьлева):

Сымбалі

Інтэпрэтатар Ruby рэалізуе табліцу так званых сымбаляў (Symbols), у каторай ён захоўвае імёны ўсіх клясаў, мэтадаў і зьменных. Гэта дазваляе пазьбегнуць некаторых цяжкіх апэрацыяў параўнаньня сымбальных чародаў (Strings): інтэрпрэтатар атрымлівае доступ да, напрыклад, мэтаду па яго парадкаваму нумару ў табліцы, а не па яго імені.

У Ruby ідэя сымбаляў рэалізавана нават яшчэ на крок далей — да сымбаляў можна зьвяртацца ў самой праграме. Яны выглядаюць амаль як лякальныя зьменныя, але перад імі ставіцца двукроп’е і азначаюць яны палегчаныя радкі — стварыўшыся аднойчы, яны застаюцца ў памяці да канца працы праграмы і пры наступным выкарыстаньні проста бяруцца з памяці, а не ствараюцца па-новай. Вобласьць іх ужываньня — унутры праграмы, то бок гэта ня тыя радкі, каторыя прызначаныя для паказу карыстальніку. Прыклады:

Наступны прыклад правярае ці мае аб'ект o вызначэньне мэтаду size, і калі так, выклікае гэты мэтад:

Сымбалі можна пераўтвараць у чароды і наадварот:

Важнай асаблівасьцю зьяўляецца тое, што дзьве сымбальныя чароды могуць утрымліваць аднолькавы зьмест, але зьяўляцца двумя рознымі аб'ектамі, а для сымбаляў гэта ня так. Два радкі з аднолькавым зьместам пры канвертацыі ў сымбаль дадуць адзін і той жа аб'ект.

true, false, nil

Ключавыя словы true і false прадстаўляюць булеўскія значэньні. Прычым асобнай клясы Boolean у Ruby не існуе. Выкарыстаньне true эквівалентна выкарыстаньню singleton-экзэпляра клясы TrueClass, а выкарыстаньне false эквівалентна выкарыстаньню singleton-экзэпляра клясы FalseClass. nil — гэта адмысловы singleton-экзэпляр клясы NilClass, каторы прадстаўляе пусты ці «неіснуючы» аб'ект.

Трэба памятаць, што true, false і nil — аб'екты, не лічбы. Гэта азначае, што false і nil ня тое ж самае, што 0, а true ня тое ж самае, што 1. У месцах, дзе патрабуецца булеўскае значэньне, nil трактуецца як false, а значэньні адрозныя ад nil і false трактуюцца як true.

Мэтады, працэдуры, лямбды

RSpec – гэта фрэймворк Unit-тэставаньня і функцыянальнага тэставаньня для Ruby.

Рэгулярныя выразы

Рэгулярныя выразы (regexp) — пасьлядоўнасьць сымбаляў, заключаных паміж слэшаў:

Яны прызначаны для хуткага пошуку словаў ці патэрнаў у тэксьце.

RSpec

RSpec – гэта фрэймворк Unit-тэставаньня і функцыянальнага тэставаньня для Ruby.

блёк describe апісвае паводзіны клясы
тэсты запісваюцца пры дапамозе блёку it
блёкі before і after - выконваюцца да і пасьля тэстаў. :all - аднойчы перад усімі тэстамі, :each - перад кожным тэстам

http://marakana.com/s/post/1145/efficient_rail_test-driven_development_course

http://betterspecs.org/

http://benscheirman.com/2011/05/dry-up-your-rspec-files-with-subject-let-blocks

http://eggsonbread.com/2010/03/28/my-rspec-best-practices-and-tips/

http://blog.emson.co.uk/2008/06/understanding-rspec-stories-a-tutorial/

http://blog.davidchelimsky.net/category/rspec/

http://rubydoc.info/gems/rspec-core

http://rubydoc.info/find/github?q=RSpec

Gems

airbrake - Send your application errors to our hosted service and reclaim your inbox.

Pry: адладка тэстаў.

Выкананьне тэсту спыніцца на 4 радку з прапановай irb.

DevKit

Большасьць гемаў даступны ў бінарным выглядзе і для іх усталёўкі дастаткова набраць gem install <GEM_NAME>. Але гэта тычыцца ня ўсіх гемаў. Некаторыя зь іх, так называемыя натыўныя, даступны толькі ў выглядзе зыходнікаў (напр. на C/C++) і для іх "зборкі" патрэбна пашырэньне да Ruby пад назвай Development Kit (скарочана DevKit).

Усталёўка

Па-першае спампоўваем архіў усталёўшчыка DevKit-tdm-32-4.5.1-20101214-1400-sfx.exe (ці больш актуальную вэрсію) на старонцы https://github.com/oneclick/rubyinstaller/downloads.

Запускаем спампаваны файл і пазначаем тэчку для распакоўкі, напр. <RUBY_HOME>\devkit.

Адкрываем акно каманднага радку cmd і пераходзім у ім у пазначаную вышэй для распакоўкі тэчку.

У акне каманднага радку пасьлядоўна запускаем наступныя каманды:

Вынік каторай будзе прыкладна такім:

ruby dk.rb init

Далей:

Вынік каторай будзе прыкладна такім:

ruby dk.rb review

На гэтым этапе трэба пераканацца, што ўсталёўшчык правільна падхапіў шлях да вашай Ruby-усталёўкі. Калі шлях ня правільны, тады трэба адпаведна падправіць файл <RUBY_HOME>\devkit\config.yml.

Ну і напрыканцы непасрэдна ўсталёўка:

Вынік каторай будзе прыкладна такім:

ruby dk.rb install

Праверка

Запусьціць усталёўку натыўнага гема і тым самым спраўдзіць ці правільна ўсталяваўся DevKit можна наступным чынам:

Вывучыць крыніцы

Eventmachine: Event-Driven I/O Framework/Engine

NET to Ruby: Learning How to Write Tests, Part II — частку гэтага матэрыялу варта перанесьці ў даведнік па Rails

Functional Programming Techniques With Ruby: Part I

Using a Graph Database with Ruby. Part I: Introduction

Даведнікі пераехалі на GitHub Pages. Актуальная вэрсія даступная па адрасе: https://yurtsevich.github.io/refs/ruby/