02. Условия и списъци

02. Условия и списъци

02. Условия и списъци

9 октомври 2013

Какво предстои

Пред-предговор

идната сряда ще пием бира

Предговор

GitHub приноси

pull request-ите и животът ви

Pull request-ите и общуването

Pull request-и: някои насоки

Преди да пуснете pull request с вашето предложение за промяна:

Бонус точки

отвъд сникерсите (последно напомняне)

Първите ви точки:

Първа задача

Стил

Споделяне на решения

a.k.a. преписване

Малко тривиа

където ние питаме, а вие отговаряте

(ако сте записали курса)

Въпрос 1

Каква е разликата между тези имена?

foo  = 1
Bar  = 2
$baz = 3

foo е локална променлива, Bar е константа, $baz е глобална променлива

Въпрос 2

Кои от следните неща се оценяват до неистина?

0 [] nil {} ""

Само false и nil са неистина.

Въпрос 3

Каква е разликата между единични и двойни кавички?

В единичните няма интерполация, в двойните - има.

В единичните могат да се екранират само \\ и \'. В двойните има ред екранирания и специални символи.

Булеви оператори

Сравнение

...когато размерът има значение

>> 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

Условия

на един ред

eat if hungry?

Яко, а? Може и:

order = if hungry? then 'food' else 'coffee' end

Условия

освен ако

unless е като if not.

Всичко за if е приложимо

Не ползвайте unless с else (style warning!)

unless tired?
  go_out_and_run
end

Рационални числа

Кратко проучване

Колко от вас са запознати със следните неща:

Минимално необходимо знание за всеки програмист

Отклониение

#to_s и #inspect

Един обект се обръща до низ с #to_s. Има и друг вариант, #inspect, който го обръща до текстов низ, изглеждащ като ruby код. Целта е инспектиране.

Преди това

хилядите значения на диез

Масиви

Масиви

индексиране

numbers = [:zero, :one, :two]
numbers[1]   # :one
numbers[10]  # nil
numbers[-1]  # :two

numbers[5] = :five
numbers[5]   # :five
numbers      # [:zero, :one, :two, nil, nil, :five]

Масиви

fetch

Array#fetch хвърля грешка или връща друга стойност, при индексиране извън обема на масива:

numbers = [:zero, :one, :two]

numbers.fetch(1)            # :one
numbers.fetch(10, :dunno)   # :dunno
numbers.fetch(10)           # error: IndexError

numbers[10] or :dunno       # като предното, ама не точно

Ползва се по-рядко, отколкото си мислите.

Масиви

типичните методи

numbers = [3, 1, 2, 4]
numbers.length  # 4
numbers.size    # 4
numbers.sort    # [1, 2, 3, 4]
numbers.reverse # [4, 2, 1, 3]
numbers[1..2]   # [1, 2]

sort и reverse връщат нов масив, без да променят numbers.

Масиви

#include?

#include? ви казва дали масив съдържа даден елемент.

prime_digits = [2, 3, 5, 7]

prime_digits.include? 2    # true
prime_digits.include? 4    # false

Внимание: линейно търсене. Подходящо за малки списъци.

Масиви

забавни оператори

[:a, :b, :c] + [:d, :e]             # [:a, :b, :c, :d, :e]
[:a, :b, :c, :b, :a] - [:b, :c, :d] # [:a, :a]
[:a, :b, :c] & [:b, :c, :d]         # [:b, :c]
[:a, :b, :c] | [:b, :c, :d]         # [:a, :b, :c, :d]

& и | конкатенират списъците и премахват повторенията.

В Ruby има множества, които са по-удачни в повечето случаи.

Масиви

мутиране

numbers = [1, 2, 3]

numbers << 4
p numbers   # [1, 2, 3, 4]

numbers.insert 0, :zero
p numbers   # [:zero, 1, 2, 3, 4]

result = numbers.delete_at(0)
p result    # :zero
p numbers   # [1, 2, 3, 4]

Масиви

push и pop

stack = [1, 2, 3]

stack.push 4
p stack         # [1, 2, 3, 4]

top = stack.pop
p stack         # [1, 2, 3]
p top           # 4

#shift и #unshift са аналогични, но работят с началото на масива.

Масиви

разни други методи

[1, 2, 3].join("-")        # "1-2-3"
[1, 2, 3].permutation      # сещате се какво връща
[1, 2].product([3, 4])     # [[1, 3], [1, 4], [2, 3], [2, 4]]
[[1, 2], [3, 4]].transpose # [[1, 3], [2, 4]]
[1, 2, 3, 4].shuffle       # разбърква масива произволно

Има ред такива методи, които може да намерите в Ruby Doc.

Документация

свиквайте с нея отсега

Масиви

последната запетая

Може да оставите запетая след последния елемент на масива. Така редовете се разместват по-лесно. Важи и за хешове.

songs = [
  'My Favorite Things',
  'Alabama',
  'A Love Supreme',
]

Масиви

пърладжийски истории

Има специален синтаксис за масив от думи.

%w(chunky bacon)     == ['chunky', 'bacon']
%w[a b c]            == ['a', 'b', 'c']
%w{cool stuff}       == ['cool', 'stuff']
%w<coffee tea water> == ['coffee', 'tea', 'water']
%w|foo bar|          == ['foo', 'bar']

Може да използвате различни видове символи, които да ограждат думите от масива:

! @ # $ * - _

Този списък от символи е непълен.

Масиви

Array#slice voodoo

Масиви

Array#slice

numbers = [1, 2, 3, 4, 5, 6]

numbers[0..2]   # [1, 2, 3]
numbers[-3..-1] # [4, 5, 6]
numbers[1, 1]   # [2]

numbers[0..2] = [:wat]

numbers         # [:wat, 4, 5, 6]

Масиви

итерация

Итерира се с #each, както всичко останало в Ruby:

primes = [2, 3, 5, 7, 11]

primes.each { |n| puts n }

primes.each do |n|
  puts n
end

Sidenote: for

...или как да губим точки

"Къдрави скоби" и do/end

Въпроси