Папярэдні занятак

Інтэрпаляцыя радкоў і камэнтары

Вы можаце зьмяшчаць зьменныя ў радках:

  • age = 21
  • "I am #{age} years old."

Зразумела? Усё што знаходзіцца ў #{ } выконваецца Ruby і зьмяшчаецца ў радок. Гэта завецца інтэрпаляцыя радкоў.

І яшчэ лепей:

  • age = 21
  • from_now = 5
  • "In #{from_now} years, I will be #{age + from_now} years old."

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

Калі сымбал # унутры радка – гэта інтэрпаляцыя радкоў. Тым ня менш, калі ён па-за радку – гэта значыць comment (камэнтар), і ўсё што знаходзіцца пасьля сымбала ігнаруецца.

  • "do something" # here's a comment
  • # here's another comment
  • "do something else"

Адзінарнае двукосьсе

Радкі таксама можна запісваць з адзінарным двукосьсем:

  • 'I am a string, too.'

Зараз паспрабуйце так:

  • 'I am a "double quote" in a single quote string.'
  • "I am a 'single quote' in a double quote string."
І гэта:
  • 'This won't work.'

Звярніце ўвагу на тое, як Ваш камандны радок зьмяніўся з > на '>? Вы знаходзіцеся ў незачыненым радку. Надрукуйце ' і націсніце enter. Вы атрымаеце памылку й вернецеся да звычайнага каманднага радку.

Паспрабуйце вызначыць што рабіць у такім выпадку:

  • "This "won't" work, either."

Вы ня можаце выкарыстоўваць інтэрпаляцыю радкоў у адзінарных двукосьсях.

  • string_interpolation = "a string which can be interpolated"
  • 'You cannot use #{string_interpolation} in single quotes.'

Зьмяненьне радкоў

Паспрабуйце:

  • 'String one ' + 'String two'

І гэта:

  • 'String one ' << 'String two'

<< завецца shovel (рыдлёўка :).

Пагуляйце яшчэ з + і <<. Як Вы думаеце, чым shovel адрозьніваеццца ад звычайнай апэрацыі +?

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

Таксама паспрабуйце памножыць радок на лічбу. Што атрымалася?

  • 'a' * 100

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

Элемэнты радкоў (З чаго складаецца радок)

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

  • my_string = "aginski"
  • my_string[3]

Гэта верне чацвёрты сымбал у радку.

У праграмаваньні мы звычайна лічым пачынаючы з нуля. Таму нулявы элемэнт майго радку my_string гэта "s", а чацёрты элемэнт – "h".

Калі Вы хочаце дастаць больш элемэнтаў з радку:

  • my_string[2..4]

Гэтая каманда кажа Ruby вярнуць усе элемэнты з другога па пяты.

А што будзе калі выкарыстоўваць адмоўныя лікі? Паспрабуйце!

Таксама можна выкарыстоўваць вось такі сынтаксіс:

  • my_string[3,4]

Такім чынам Вы пачнеце з чацвёртага элемэнта (памятайце мы пачынаем лічыць з 0!) і атрымаеце наступныя пяць сымбалаў.

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

  • my_string[2,4]
  • my_string.[](2,4)

Гэтыя дзьве каманды эквівалентныя; першая ёсьць сінтаксічны цукар для другой.

Глабальныя мэтады

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

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

Глабальны мэтад для Вас каб паспрабаваць:

  • rand(5)

Ці здагадаліся Вы што ён робіць? Ён вяртае Вам выпадковы цэлы лік (integer) больш за або роўны 0 і меншы чым 6.

Анатомія мэтада

Паспрабуйце напісаць такі вось мэтад:

  • def sum(number1, number2)
  • return number1 + number2
  • end

Кожны мэтад пачынаецца з ключавога слова def (“define” – вызначыць мэтад) і скончваецца ключавым словам end. Ключавыя словы зарэзерваваны Ruby для спецыяльных мэтаў і ня могуць быць выкарастаны як імя для зьменнай.

Назвы мэтадаў мусяць пачынацца з маленькай літары. Традыцыйна ўсе мэтады пішуцца з маленькай літары й словы ў іх падзяляюцца ніжнімі падкрэсліваньнямі. Такі стыль завецца snake case (стыль зьмяі). Чаму так – варта падумаць :).

Заўвага: Можа адбыцца так, што Вы зноў будзеце бачыць нешта накшталт ?>. Гэта значыць што Вы яшчэ не зачынілі мэтад – трэба надрукаваць end. Тут усе тое ж самае як і з радкамі.

Давайце разьбярэмся што адбываецца калі мы, напрыклад, выканаем sum(3,5):

  1. Мы выклікаем мэтад sum з аргумэнтами (3,5).
  2. Мэтад sum выконваецца. number1 усталюецца роўнай 3, а number2 – 5.
  3. Падлічваецца 3 + 5.
  4. Вынік 3 + 5 вяртаецца.
  5. Мэтад sum скончыў сваё выкананьне.

Паглядзіце на назвы зьменных (параметраў): number1 і number2. Я бы мог назваць іх n1 і n2 і тады б канешне менш надрукаваў. Але назва number1 вельмі відавочна адлюстроўвае навошта гэтая зьменная, у той час калі n1 патрабуе ад іншага распрацоўшчыка (ці мяне ў будучыні калі я вярнуся да свайго коду праз некалькі месяцаў і ня здолею зразумець як там усе працуе) зразумець што яна робіць з кантэкста. У гэтым прыкладзе, вядома, было б зусім відавочна што такое n1. Але калі Вы навучыце сябе заўсёды даваць зьменным, тыя імёны якія відавочна іх апісваюць, у будучыні Вы пазьбегнеце вялікую колькасьці памалык, калі сутыкнёцеся з вялікімі й складанымі прыкладаньнямі.

Зараз стварыце мэтад subtract (адняць), заснаваны на мэтадзе sum вышэй. Памятайце, нельга яго называць sub :). Таму што sub можа значыць, напрыклад: substitute (замяніць).

Калькулятар

Давайце пачнем з чагосьці простага й створым невялічкі калькулятар. Стварыце мэтады sum, subtract, multiply і divide. Вы ўжо стварылі sum і subtract, таму павінна быць проста.

Калькулятар з радкамі

Калі Вы будавалі свой мэтад divide, ці не забыліся Вы пераводзіць цэлыя лікі ў дробныя? Калі Вы не разумееце пра што я кажу паспрабуйце выканацьdivide(7,2). Вы атрымоўваеце 3.5 ці 3? Калі Вы атрымалі 3 вяртайцеся й перапішыце яго з дапамогай to_f.

Каб нам зразумець якім у будучыні павінен быць мэтад, ма напішам нешта накштал юніт тэстаў (unit tests). Юніт тэст выглядае прыкладна так:

divide(9,2) мусіць вяртаць 4.5.

Юніт тэсты лепей пісаць перад тым, як Вы пачнеце пісаць код.

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

sum(5,6) мусіць быць роўна "The sum of 5 and 6 is 11."

Окей, пачынайце!

Яшчэ тэсты:

subtract(9,2) мусіць быць роўна "The difference between 9 and 2 is 7.".
multiply(2,4) мусіць быць роўна "The product of 2 and 4 is 8.".
divide(9,2) мусіць быць роўна "The quotient of 9 and 2 is 4.5.".

Пераўтваральнік радкоў

Напішыце наступныя мэтады:

  • echo вяртае радок паўтораны двойчы.
  • shout вяртае радок з усімі вялікімі літарамі.
  • backwards вяртае радок перадам назад.

Тэсты:

echo("i love cookies!") мусіць быць роўна "i love cookies! i love cookies!".
shout("What is going on?") мусіць быць роўна "WHAT IS GOING ON?".
backwards("abc def") мусіць быць роўна "fed cba".

Аб’яднаўцы радкоў

Стварыце наступныя мэтады:

  • Мэтад smoosh які прымае два радка як аргумэнты й вяртае адзін без прабелаў паміж словамі.
  • Мэтад list які прымае тры радка й пералічвае іх у адзін радок падзяляючы коскамі.

Юніт тысты:

smoosh("potato", "chips") мусіць быць роўна "potatochips".
list("one", "two", "three") мусіць быць роўна "one, two, three".

Выманьне сымбалаў

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

  • Стварыце мэтад first_character які вяртае першы сымбал у радку.
  • Стварыце мэтад last_character які вяртае апошні сымбал у радку.

Тэсты, каб зразумець:

first_character("hot tea") мусіць быць роўна "h".
last_character("cold coffee") мусіць быць роўна "e".
Наступны занятак