Преди да пуснете pull request с вашето предложение за промяна:
Първите ви точки:
(ако сте записали курса)
Каква е разликата между тези имена?
foo = 1
Bar = 2
$baz = 3
foo
е локална променлива, Bar
е константа, $baz
е глобална променлива
Кои от следните неща се оценяват до неистина?
0 [] nil {} ""
Само false
и nil
са неистина.
Каква е разликата между единични и двойни кавички?
В единичните няма интерполация, в двойните - има.
В единичните могат да се екранират само \\
и \'
. В двойните има ред екранирания и специални символи.
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
Това е стандартното поведение на 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
Rational
Rational(a, b)
или с литерален синтаксис (само в 2.1): 0.1r
Колко от вас са запознати със следните неща:
map
и filter
Минимално необходимо знание за всеки програмист
Един обект се обръща до низ с #to_s
. Има и друг вариант, #inspect
,
който го обръща до текстов низ, изглеждащ като ruby код. Целта е инспектиране.
puts(something)
извежда something.to_s
p(something)
извежда something.inspect
#
е коментар
#puts
, Array#inject
"The answer: #{40 + 2}"
C#
Array
. Разбира се, има литерален синтаксис[1, 2, 3, 4]
[18, :female, 'Burgas']
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]
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?
ви казва дали масив съдържа даден елемент.
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]
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']
Може да използвате различни видове символи, които да ограждат думите от масива:
! @ # $ * - _
Този списък от символи е непълен.
slice
(документация)[]
е всъщност метод на 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
for
#each
do
/end
се ползва, когато блокът е няколко реда