01. Въведение в Ruby
6 октомври 2014
Административни неща
...където припомняме за какво идеше реч
- Ruby курс, в който влизаме дълбоко в заешката дупка
- Аз съм Митьо и зад мен стои една армия вместо екип (ще ни видите на сайта)
- Понеделник и сряда, зала 200, от 19-21 ч.
- Сайтът ни е fmi.ruby.bg — регистрирайте се
скоропостижно, ако все още не сте.
- Имаме Facebook група и
Twitter потребител, ако си падате по тези неща
Административни неща (2)
- Курсът е труден, тежък, страшен...
- Но и inclusive!
- Ако идвате само за кредити и/или оценка, по-добре отпишете
- Основно лекции (и някои други неща), нямаме упражнения
- Присъствието е силно препоръчително (така ще ви е доста по-лесно)
- Всичко се върти около сайта на курса и присъствие на лекциите, направете си сметка
- Вижте уводната лекция "За курса" за подробности (вариант на лекцията с бележки)
Добри новини (за изостаналите)
или как да изкарате първите си 3 точки
- Сложете си снимка на сайта – градим общност
- Качете си Ruby 2.1.3 и качете screenshot на форумите
- НОВО! НОВО! НОВО! Представете се във форумите – отново, общност
По-добри новини
първа задача
- Ще ви я дадем още тази седмица (сряда)
- Ще имате една седмица
- Ще включва материал от днес и от сряда
- Припомняме, че ако не предадете повече от 3 задачи, ще се видим септември
Още по-добри новини
първо предизвикателство
- Още днес, в края на сбирката ще е онлайн
- Имате време до утре вечер (полунощ)
- Съвсем просто, за загрявка
- Припомняме, че предизвикателствата носят 1 т. и са опционални
Класация
Това е от миналата година. Тази година сте доста по-пъргави и класацията е еднообразна в момента :)
Цели
За какво ще говорим днес?
- Какво е Ruby програма и как се изпълнява?
- Как да се справим с документацията в Ruby
- Основните типове в Ruby
- Променливи и константи
- Условни конструкции —
if
- Дефиниране и извикване на прости функции
В случай на въпрос
- Изчакайте до края на текущия слайд
- Ако не получите отговор, вдигнете ръка
- Питайте мен или колегите от екипа в почивките
- Питайте другарче
- Питайте във форумите
- Но питайте
Ruby програми
- Програмите в Ruby са текстови файлове
- Няма компилация като в C или Java
- Изпълняват се в терминал/конзола/command prompt с
ruby име_на_файл
Ruby програми
Любимият на всички пример
puts "Hello world"
puts "The answer of life is ", 6 * 7
Изпълнява се с ruby hello.rb
Конзола
където ще прекарваме много време
- Не е специфично за Ruby
- Това е бил единственият "интерфейс" с ОС преди GUI
- Все още го има – много удобно за автоматизиране на задачи
- Позволява стартиране на процеси, които (обикновено) нямат GUI
- Ще прекарваме доста време там; направете си я удобна и свиквайте
- Под Windows имате алтернативи на дървения Command Prompt
irb
интерактивна конзола
irb
– Interactive Ruby
- REPL — Read-Eval-Print Loop
- Тук ще прекарваме доста време - и ние, и вие
- Стартирате я с
irb
(трябва да ви е в "пътя")
- Самото
irb
е конзола в конзолата
- Излизате в конзолата с
exit
или с Ctrl + D
(под UNIX)
irb
интерактивна конзола
$ irb
>> 6 * 9
54
>> "Ruby! " * 4
"Ruby! Ruby! Ruby! Ruby!"
>> -10.abs
10
irb
особености
Ctrl + C
и Ctrl + D
- Windows - Copy/paste
- Синтактични грешки
- Алтернативни терминали/конзоли (вж. форумите)
- Мини демо тайм
Документация
или как да разберем какво прави нещо в Ruby?
ri
е инструмент, с който може да разглеждате документацията на клас или методri String
показва документацията на класа String
ri Numeric#abs
показва документацията на метода abs
на класа на числата ri -i
пуска документацията в интерактивен режим. Пробвайте го. - Документацията е достъпна онлайн на http://ruby-doc.org/
- APIDock е ваш добър приятел
Съставните части на една Ruby програма
ръководство по ориентиране
- Синтаксис (вкл. и ключови думи)
- Ключови думи
if
, def
, class
, defined?
и още дузина-две
- Ядро (core) – http://ruby-doc.org/core/
- Стандартна библиотека (stdlib) – http://ruby-doc.org/stdlib/
- Нещата от стандартната библиотека се инсталират с Ruby, но трябва да ги заредите с
require
Инсталация
или как да се снабдим?
Редактори
вечният... дебат
- Забравете за IDE-тата, това не е Java, C# и прочее
- Ако много държите на IDE, пробвайте RubyMine на JetBrains
- Най-добре ползвайте любимия си текстов редактор
- Ако нямате такъв, сега е време да си изберете
- Научете Vim или Emacs. После ще благодарите на Стефан. Или ще се сърдите на Стефан.
- Аз бих ви посъветвал да пробвате и Sublime Text
Стил
- В момента говорим за "форматиране на кода", а не за дизайн
- Изискваме от вас стил като описания тук: Ruby Style Guide
- Горното е базирано на Ruby Style Guide на г-н Бацов и е малко остаряло
- Ваша задача ще е да обновите ръководството по стил по-горе (разбира се, че ще ви платим с точки)
- Съобщение от Стефан: "Ако не можете да си подреждате кода, ориентирайте се към друга професия. Например строителство."
Извеждане на екрана
или как да досаждате на хората с текст
- Става с
puts
- Например
puts "Chunky bacon!"
puts
не е ключова дума, а "глобална" функция- Може да се извика и със скоби:
puts("Chunky bacon!")
- Последното важи за всички функции в Ruby
Имена и неща
Нещата се наименуват с =
answer = 42
almost_pi = 3.14
food = 'Chunky bacon'
greeting = "What's up?"
Имена и неща
...или разликата между нещо и неговите имена
=
не копира стойността, а насочва променливата към обекта отдясно
>> word = "oat"
>> breakfast = word
>> dinner = word
>> word.insert(0, 'g')
>> puts breakfast
goat
Действия
още известни като "методи"
>> "shut up".upcase()
→ "SHUT UP"
>> "wonderful".sub("wonder", "color")
→ "colorful"
>> 3.14.floor
→ 3
>> 24.gcd 56
→ 8
>> 'wonderful'.sub 'wonde', 'colo'
→ "colorful"
Видове променливи
favourite = 'Chunky bacon' # локална
Tax = '20%' # константа
$important = 'Money' # глобална
Има още: @name
и @@name
Ключови думи
Вече заети
alias and BEGIN begin break
case class def defined? do
else elsif END end ensure
false for if in module
next nil not or redo
rescue retry return self super
then true undef unless until
when while yield
Основни типове
1/2
- Цели числа —
42
, -271
, 1_024
- Низове —
"chunky"
, 'bacon'
- С плаваща запетая —
3.1415
- Булеви —
true
и false
- Нищо —
nil
- Масиви —
[2, 3, 5, 7, 11]
Основни типове
2/2
- Хешове —
{'one' => 1, 'two' => 2}
- Регулярни изрази —
/(bb)|([^b]{2})/
- Области —
2..6
, 'a'...'z'
- Символи —
:name
, :send
- Анонимни функции —
lambda { |x| x ** 2 }
, -> x { x ** 2 }
- Обекти —
Person.new
Цели числа
0
1729
-271
1_000_000
0377 # осмични
0b0100_0010 # двоични
0xDEADBEEF # шестнадесетични
Числа с плаваща запетая
0.0
3.14
-273.15
1.22e28
1_000.001
Текст
'Chunky bacon, I say!'
"Who is John Galt?"
"We're the knights who say \"Ni!\""
'\'0 freddled gruntbugly\' he begun'
'This text contains\nno newlines'
"This text contains\none newline"
Операции с текст
>> "Hello, " + " " + "chunky!"
→ "Hello, chunky!"
>> "Ha! " * 3
→ "Ha! Ha! Ha! "
>> "%s bacon" % 'Chunky'
→ "Chunky bacon"
>> text = 'Chanky'
>> text[2] = 'u'
>> text << ' bacon'
>> puts text
Chunky bacon
Още операции с текст
"bacon\n".chop # "bacon"
"bacon".chop # "baco"
"bacon\n".chomp # "bacon"
"bacon".chomp # "bacon"
"Goodbye".include? 'oo' # true
"Danube".length # 6
"oat".insert 0, 'bl' # "bloat"
"bloat".sub "bl", "m" # "moat"
"bacon".upcase # "BACON"
"BaCoN".downcase # "bacon"
Символи
...което ще ви обърка
- Малко особен тип в Ruby
:something
, :other
и :larodi
- Сходен на низ — immutable и интерниран
- Различни приложения
- Не го мислете много
Интерполация
Работи при двойни кавички, не работи при единични
character = 'Arthur'
answer = 42
puts "#{character} had it: #{answer}"
Оператори
...или как да оперирате с Ruby
** ~ / % + - &
<< >> | ^ > < >= <= <=>
&& || ! and or not ||= &&=
= += -= *= /= %= **= >>= <<=
^= &= |= .. ... defined?
Истина и лъжа
...където става философско
nil
се оценява като "лъжа"false
се оценява като "лъжа" (очевидно)- всичко друго е истина
0
, ""
и []
са истина
Булеви оператори
and
, or
и not
правят това, което очаквате&&
, ||
и !
— също- Разликата между тях е тънка. Придържайте се към първите
Сравнение
...когато размерът има значение
>> 20 > 20
→ false
>> "perl" < "ruby"
→ true
>> 5 <= 5
→ true
>> "foo" <=> "bar"
→ 1
Равенство
...където става оплетено
В Ruby има четири оператора за равенство
one == two
one === two
one.eql? two
one.equal? two
Равенство
== и equal?
Това е стандартното поведение на Ruby. Има специални случаи.
one = 'chunky bacon'
two = 'chunky bacon'
one == two # true
one.equal? two # false
Равенство
Специалните случаи
Можете ли да произнесете "интерниране"?
one, two = 42, 42
one == two # true
one.equal? two # true
Същото важи и за символи.
Условия
Ключовата дума е if
if hungry? and sad?
eat_chocolate
listen_to_music
go :outside
end
Условия
или
Разбира се, има и else
if hungry?
eat
else
drink
end
Условия
ако пък
if hungry?
eat
elsif thirsty?
drink
else
philosophize
end
Условия
...където научавате, че всяко условие е израз
classification = if age < 13
'young person'
elsif age < 20
'teenager'
else
'old dude'
end
Условия
на един ред
Яко, а? Може и:
order = if hungry? then 'food' else 'coffee' end
Условия
освен ако
unless
е като if not
.
Всичко за if
е приложимо
Не ползвайте unless
с else
(style warning!)
unless tired?
go_out_and_run
end