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

Апэратары параўнаньня

Вы ўжо даведаліся пра лікі, радкі і масівы. Вы таксама ведаеце як працаваць цыкламі. А зараз давайце дададім трошкі лёгікі ў наш код.

Паспрабуйце надрукаваць:

  • age = 18
  • if age < 21
  • "Sorry, you can't buy alcohol."
  • else
  • "What would you like to drink?"
  • end

Гэта завецца разгалінаваньне. Вось больш складаная вэрсія:

  • age = 18
  • if age < 21
  • "Sorry, you can't buy alcohol."
  • elsif age == 21
  • "Can I see your passport?"
  • else
  • "What would you like to drink?"
  • end

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

Напішыце некалькі праграмаў у якіх ёсьць разгалінаваньне карыстаючыся >=, <=, !=.

У даданьне да ключавых словаў if, else і elsif, існуе яшчэ адно ключавое слова для параўнаньня: unless. Высветліце што яно робіць.

Ці памятаеце Вы як арытмэтычныя апэратары такія як + і - насамрэч былі сінтаксічным цукрам для мэтадаў з такімі ж назвамі? Цікава ці выконваецца тое ж самае правіла для апэратараў параўнаньня (==, < і >)…

&& і ||

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

  • if looks == 'handsome' && intelligence == 'smart'
  • "Sure, I'd love to have dinner with you."
  • elsif looks == 'handsome'
  • "I'm sorry, I'm actually busy that night. But maybe some other time."
  • else
  • "Um, I gotta go."
  • end

&& значыць and (і).

Зараз паспрабуйце ||, які значыць or (або).

Цікавы факт: Вы можаце выкарыстоўваць прама гэтыя словы and і or замест адпавядаючых апэратараў.

Booleans

Boolean гэта нешта, што адлюстроўвае true (праўду) або false (хлусьню).

Мы сустракаліся ўжо раней зь імі, але ня ведалі хто яны:

  • 6.even?
  • 8.odd?
  • 4.between?(4,5)

У Ruby мэтад скончаючыся на ? традыцыйна вяртае булен.

Вы можаце прама карыстацца true ці false проста друкуючы іх. Паспрабуйце.

Калі Вы ствараеце мэтад, які вяртае булен яго назва павінна скончвацца на ?. Напрыклад:

  • def can_vote?(age)
  • if age >= 18
  • true
  • else
  • false
  • end
  • end

Стварыце некалькі сваіх булевых мэтадаў, напрыклад can_drink?.

Усе апэратары параўнаньня вяртаюць булен:

  • 3 < 5

Таму мы можам паменшыць наш мэтад can_vote?:

  • def can_vote?(age)
  • age >= 18
  • end

nil

Ці заўважалі Вы nil? Вось некалькі месцаў дзе ён мог вылазіць:

  • puts 'hi'
hi => nil

Вось яшчэ:

  • def some_method
  • puts "I'm a method"
  • end
=> nil

Магчыма Вы бачылі яго тут:

  • some_array = ['a', 'b', 'c']
  • some_array[3]

nil адрозьніваецца ад 0, або пустога радка "", або пустога масіва[].

nil – гэта нішто. Вельмі дзэн.

Праўдзівасьць

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

  • if 5 > 3
  • "it was true"
  • else
  • "it was false"
  • end

Ня дзіўна. А што калі:

  • loves_cake = "i love cake"
  • if loves_cake
  • "it was truth-y"
  • else
  • "it was false-y"
  • end

Адкуль Ruby ведае што мне падабаюцца пірагі?

Спачатку, давайце зробім крок назад. Калі мы кажам if 5 > 3…, вось што насамрэч адбываецца: Ruby выконвае 5 > 3, што вяртае true. Потым, if глядзіць на вынік і выконвае блок коду толькі тады, калі вярнулася true.

Але часам, мы хочам кантраляваць выкананьне праграмы ня толькі булем. Вельмі часты прыклад – гэта выканаць адну частку кода калі якая-небудзь зьменная роўная nil і выканаць нешта іншае ў адваротным выпадку. У Ruby nil “хлусьлівы”: ён насамрэч не false, але ў тым выпадку калі ён знаходзіцца на месцы, дзе павінен быць булен, ён разглядаецца роўным false. Усё астатняе ў Ruby “праўдзіва”: лікі, радкі, масівы і г.д.

Даведайцеся, зьменная, роўная 0, інтэрпрэтуецца як праўда або хлусьня?

Рэдактар тэксту

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

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

Два рэдактара тэксту вельмі папулярны ў асяродзьдзі Рубі-праграмістаў. Першы – Ruby Mine. Другі – Sublime Text.

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

Адна з мацнейшых рыс такіх рэдактараў тэксту – гэта падсвятленьне сінтаксісу. Адчыніце Ruby Mine стварыце новы праект, а потым новы файл, напрылад test.rb. .rb – гэта традыцыйна пашырэньне файлаў Ruby, таму Ruby Mine спазнае яго й дапаможа Вам з спецыяльным, спецыфічным для Рубі функцыяналам. Зараз надрукуйце:

def say_hello
  puts 'hello world'
end

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

Яшчэ адна выдатная рэч – гэта магчымасьць выконваць код Ruby прама ў рэдактару тэкста. Цісніце Ctrl + Shift + F10 (у Sublime, Ctrl + B) каб выканаць усё тое, што знаходзіцца ў файле. Вы ўбачыце ўсе, што выводзіце з дапамогай puts. Давайце паспрабуем:

def say_hello
  puts 'hello world'
end
say_hello

Цісніце Ctrl + Shift + F10 (у Sublime, Ctrl + B) каб выканаць код.

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

Яшчэ адзін

Давайце пачнем з простага мэтада, які завецца one_more які прымае масіў і вяртае іншы масіў з паўтораным апошнім элемэнтам.

Вось такі юніт-тэст:

one_more([1, 2, 3]) мусіць быць роўна [1, 2, 3, 3].

Выкарыстоўвайце наступныя крокі калі пішыце код і правяраеце яго з юніт-тэстамі:

  1. Стварыце новы файл з пашырэньнем .rb – у гэтым выпадку, магчыма, one_more.rb.
  2. Устаце некалькі пустых лініяў а потым надрукуйце Вашыя юніт-тэсты ў нізе старонцы – у гэтым выпадку, надрукуйце one_more([1, 2, 3]) у нізе.
  3. Карыстайцеся puts каб адлюстроўваць чаканы вынік і вынік, які атрымаўся – т.б., puts "#{one_more([1, 2, 3])} should return [1, 2, 3, 3].".
  4. Напішыце свой код і выканайце яго Ctrl + Shift + F10 (Ctrl + B).
  5. Праверце каб вынік, які адлюстроўваецца, супадае з чаканым вынікам тэста.

Сартаваньне словаў

Стварыце праграму з мэтадам word_sort які прымае масіў слоў у ніжнім рэгістры я вяртае масіў, адсартаваны па альфабэту. Мэтад sort робіць справу досыць лёгкай.

Тэст:

word_sort(['snake', 'cantaloupe', 'grandmother']) should equal ['cantaloupe', 'grandmother', 'snake'].

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

if power > 10

else

end

потым вярнуцца й усе запоўніць:

if power > 10
  puts "That's a lot of power!"
else
  puts "You need more power."
end

Гэта дапаможа Вам пазбавіцца частых памылак з сінтаксісам.

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

Лібімая лічба

Мая любімая лічба – 13. Напішыце мэтад favorite_number? які прымае лічбу на ўваход. Калі яна менш чым 13 (або вашае любімае лічбы), мэтад мусіць вяртаць “Little higher…”; калі больш чым 13 – “Little lower…”; і калі лічба роўна 13, мэтад мусіць вяртаць “That’s my favorite number!”

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

def my_method
  if #something
    #do something
  elsif #something else
    #do something else
  end
end

Юніт-тэсты:

favorite_number(12) should equal 'Little higher...'.
favorite_number(14) should equal 'Little lower...'.
favorite_number(13) should equal 'That's my favorite number!'.

Пераступны(высакосны) год

З гэта кропкі мы пачнем пісаць насамрэч складаныя мэтады. Але нельга здавацца!

Пераступныя гады падзяляюцца на 4 (напрыклад 1992 і 1996). Праўда ёсьць выключэньне, і, выключэньне ў выключэньне: Калі год падзяляецца на 100 – гэта не пераступны год (напрыклад 1900), калі год яшчэ падзяляецца на 400, тады гэта пераступны (як год 2000).

Стварыце мэтад leap_year? які прымае год як аргумэнт і вяртае true калі год пераступны й false калі не.

Апэратар % будзе вельмі зручным у гэтым заданьні.

Юніт тэсты:

leap_year?(1983) should equal false.
leap_year?(1992) should equal true.
leap_year?(1900) should equal false.
leap_year?(2000) should equal true.

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

Github

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

Самы лёгкі спосаб расшаріць такіе маленькія праграмы як Вашы – гэта Gist. Калі Вы залагінены ў Github, зверху ёсьць спасылка, якая завецца Gist. Цісніце яе й Вы зможаце стварыць новы Gist. Скапіюце код ‘Пераступных гадоў’ у Gist, выбярыце Ruby як мову праграмаваньня й дайце яму тлумачэньне. Потым цісніце ‘Create Public Gist’. Зараз Вы можаце паказаць Ваш код усім Вашым сябрам.

Усе прыктыкаваньні, якія Вам падаюцца складанымі й якія Вы здолелі зрабіць дадавайце ў Гіст. Такім чынам Вы будзеце мець паблік-партфоліё вашае працы.

Трыкутнік

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

  • роўнабаковы: усе бакі роўныя;
  • роўнабедраны: толькі два бакі роўныя;
  • нераўнабаковы: усе бакі розныя.

Памятайце што ня ўсе камбінацыі складаюць трыкутнік. Напрыклад, (2,2,8) ня ёсьць трыкутнік. Галоўнае правіла – калі адзін з бакоў роўны або больш за астатнія два, тады гэта не трыкутнік. У такім выпадку вяртайце "invalid".

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

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

З вялікай літары

Стварыце мэтад title_case які прымае на ўваход радок і робіць кожную першую літару словаў вялікай. Астатнія мусяць быць маленькімі.

Напішыце тэсты для розных уваходных дадзеных: усе маленькімі літарамі, усе вялікімі, маленькімі й вялікімі ўперамешку, адно слова, шмат словаў і ўсё што Вы можаце прыдумаць.

Не забудзьцеся пра рэфактарынг.

Фактарыял

Фактарыял – гэта апэратар, якія памнажае цэлы лік на ўсе цэлыя лікі менш чым ён сам. Напрыклад 5! = 5 * 4 * 3 * 2 * 1 = 120.

Па азначэньні – 0! = 1.

Стварыце мэтад factorial каб лічыць фактарыялы. Дыяпазоны будуць вельмі зручныя тут.

Але спачатку напішыце тэсты! Я бы пачаў для станоўчых лікаў, выканаў праверку; потым для нуля, выканаў праверку; і для адмоўных лікаў.

І, вядома, рэфактарынг у канцы.

Наступны занятак