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

Кіруючыя пасьлядоўнасьці

Вы амаль усе ведаеце пра асновы Рубі! Але, перад тым як мы пачнем разглядаць сапраўдныя праграмы, Вы павінны ведаць як атрымаць уваходныя дадзеныя(інпут) ад карыстальніка й як адлюстраваць выходныя дадзеныя (аўтпут). Вы ўжо трошкі ведаеце пра аўтпут праз мэтад puts. Паспрабуйце выканаць:

  • puts “hi!\nbye!”

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

\t – гэта кіруючая пасьлядоўнасьць табуляцыі. Паспрабуйце й гэта.

Якая кіруючая пасьлядоўнасьць для сымбала escape? У IRB, выканайце escape = gets і цісніце escape а потым enter.

Зараз паспрабуйце дадаць кіруючыя пасьлядоўнасьці ў радок з аднакосьсямі puts 'hi!\nbye!'. Атрымліваецца?

Puts і p

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

classSquaredef initialize(length)@length= length
  endend

Зараз выканайце puts Square.new(5). Аб’ект класа Square даволі нязграбна выгладае на экране й вяртаецца nil. Ня вельмі зручна.

Зараз паспрабуйце p Square.new(5). p вельмі падобны на puts у тым плян што ён таксама друкуе на экран. p, тым ня менш, выклікае .inspect у аб’екта, які вяртае тое ж нязграбнае прадстаўленне, але таксама ўключае зьменныя асобніка й іх значэньні. p таксама вяртае аб’екта, замет таго каб вяртаць nil. Гэта лепей.

Давайце зробім яшчэ адну рэч перад тым як рухацца далей. Абодва puts і p працуюць выклікаючы мэтад to_s у аб’екта; to_s вяртае нязграбнае прадстаўленьне аб’екта з незразумелымі лічбамі калі ён не перапісаны. Таму давайце перапішам яго:

classSquaredef initialize(length)@length= length
  enddef to_s
    "A square with sides of length #{@length}."endend

Паспрабуйце зараз puts і p. Нармалёва, ага?

Уваходныя дадзеныя (Input)

Вы ўжо ведаеце пра тое як адлюстроўваць інфармацыю карыстльніку, але як яе атрымоўваць? Паспрабуйце выканаць:

  • gets
Type something here and press enter.

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

  • user_input = gets
Type something here and press enter.
  • user_input

Надакучвае, што gets захапляе сымбал новага радка кожны раз калі мы ціскаем Энтэр. Мэтад chomp можа дапамагчы тут:

  • “Can you remove this newline, please?\n”.chomp

Карыстайцеся gets.chomp каб захапіць інпут бяз сымбала новага радку.

Як арганізоўваць Вашыя файлы

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

def title_case(input)
  input.split.map {|word| word[0].upcase + word.downcase[1..-1]}.join(' ')end

puts "#{title_case('Vitaut')} should equal 'Vitaut'"
puts "#{title_case('test')} should equal 'Test'"
puts "#{title_case('1991')} should equal '1991'"
puts "#{title_case('vAsiA')} should equal 'Vasia'"
puts "#{title_case('course.by project')} should equal 'Course.by Project'"
puts "#{title_case('haRRy poTTer')} should equal 'Harry Potter'"

Я хачу дадаць інтэрфэйс карыстальніка які будзе выглядаць прыкладна так:

puts 'Welcome to my first program! I will title all cases!'
title =niluntil title =="\n"
  puts 'What do you want to convert to title case?'
  puts 'Press esc and then enter to exit.'
  title = getsunless title =="\n"
    puts 'I have converted that title:'
    puts title_case(title)
    puts "\n"endend

Калі я дадам гэта ў мой першы файлы, тэсты будуць выконвацца кожны раз калі я выконваю праграму. Давайце падзелім нашую праграму на тры файла: title_case.rb для кода мэтада, title_case_spec.rb для юніт-тэстаў (што часам завецца спецыфікацыяй) і title_case_ui.rb для інтэрфэйса карыстальніка.

Вось як выглядае title_case.rb:

def title_case(input)
  input.split.map {|word| word[0].upcase + word.downcase[1..-1]}.join(' ')end

Вось як title_case_spec.rb

require'./title_case'

puts "#{title_case('Vitaut')} should equal 'Vitaut'"
puts "#{title_case('test')} should equal 'Test'"
puts "#{title_case('1991')} should equal '1991'"
puts "#{title_case('vAsiA')} should equal 'Vasia'"
puts "#{title_case('course.by project')} should equal 'Course.by Project'"
puts "#{title_case('haRRy poTTer')} should equal 'Harry Potter'"

Радок require './title_case' кажа Ruby выканаць весь код з title_case.rb, таму мэтад які знаходзіцца ў гэтым файле будзе даступны нам. Гэтак жа як .. значыць вышэй на адзін узровень “up one level”, . значыць бягучую тэчку (папку).

І ўрэшце код title_case_ui.rb:

require'./title_case'

puts 'Welcome to my first program! I will title all cases!'
title =niluntil title =="\e"
  puts 'What do you want to convert to title case?'
  puts 'Press esc and then enter to exit.'
  title = getsunless title =="\e"
    puts 'I have converted that title:'
    puts title_case(title)
    puts "\n"endend

Давайце зробім апошні крок у тым як мы арганізоўваем файлы. Калі мы маем толькі тры файлы, мець іх усіх у адной тэчке не складана. Але ў вялікіх праектах, нашмат прасьцей будзе ўсе арганізаваць калі тэсты будуць у тэчке spec, функцыі ў lib (гэта традыцыйная назва для праектаў Ruby) і інтэрфэйс карыстальніка знаходзіцца ў галоўнай тэчцы. Арганізуйце Вашыя файлы каб яны знаходзіліся ў адпаведных дырэкторыях.

Вам будзе патрэбна зьмяніць аргумэнты ў require на ./lib/title_case.

Урэшце пакладзіце ўсе вашыя тэчкы ў project folder дырэкторыю title_case. Гэта завецца тэчка праекта. З гэтага моманту Вы мусіце арганізоўваць усе Вашыя наступныя праекты так.

Пабудуйце свае ўласныя UI (user interface)

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

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