Professional Documents
Culture Documents
Szybki start
Autor: Larry Ullman
ISBN: 978-83-246-2258-0
Tytu oryginau: Ruby: Visual QuickStart Guide
Format: 170x230, stron: 448
Spis treci
Spis treci
Rozdzia 1.
Wstp
Zaczynamy
17
Proste skrypty
35
Rozdzia 3.
Typy podstawowe
Spis treci
51
Liczby .................................................................................................................... 52
Obliczenia arytmetyczne ...................................................................................... 54
Metody operujce na liczbach .............................................................................. 56
acuchy znakw .................................................................................................. 59
Interpolacja i zastpowanie .................................................................................. 61
Podstawowe metody operujce na acuchach znakw ..................................... 64
acuchy znakowe wielowierszowe .................................................................... 66
Stae ....................................................................................................................... 69
Data i czas .............................................................................................................. 71
Rozdzia 4.
75
Spis treci
Usuwanie elementw ............................................................................................ 86
Tablice i acuchy znakw .................................................................................... 88
Uywanie zakresw ............................................................................................... 90
Tworzenie haszw ................................................................................................. 93
Standardowe metody klasy Hash ........................................................................... 95
Rozdzia 5.
Struktury sterujce
97
Operatory ............................................................................................................... 98
Podstawowe instrukcje warunkowe ................................................................... 101
Instrukcje warunkowe zoone .......................................................................... 105
Operator warunkowy .......................................................................................... 108
Instrukcja case ..................................................................................................... 112
Ptle ..................................................................................................................... 116
Iteratory liczbowe ............................................................................................... 120
Iteratory kolekcji ................................................................................................. 123
Rozdzia 6.
Tworzenie metod
127
Spis treci
Klasy
151
185
Spis treci
Rozdzia 9.
Moduy
213
Wyraenia regularne
229
257
Rozdzia 12.
RubyGems
Spis treci
283
Katalogi i pliki
305
Spis treci
Rozdzia 14.
Bazy danych
333
Sie
353
Ruby on Rails
373
Spis treci
Programowanie dynamiczne
409
Skorowidz
429
Klasy
151
Klasy
Rozdzia 7.
Proste klasy
Programowanie proceduralne podchodzi do
aplikacji jako do krokw, ktre naley wykona.
Przeciwnie do niego programowanie obiektowe
skupia s na danych przetwarzanych w aplikacji.
Stosujc takie podejcie, klasa musi reprezentowa
dane aplikacji w sensie danych, ktre s
przechowywane, jak i zada do wykonania.
Informacja moe by reprezentowana przez
zmienne (nazywane atrybutami lub
waciwociami klasy) oraz funkcje (w klasach
nazywanymi metodami). Jako teoretyczny
przykad wemy osob: posiada ona atrybuty
imi, wiek itp. oraz metody je, pi itd.
Podstawow definicj klasy rozpoczyna sowo
kluczowe class, po czym nastpuje nazwa klasy.
Nastpnie jest jej kod (ciao klasy), definicj klasy
koczy sowo kluczowe end.
class NazwaKlasy
# kod klasy
end
Proste klasy
hw = HelloWorld.new
Klasa Struct
Jeli potrzebujesz przechowa wiele informacji w strukturze podobnej do klasy, ale nie musisz
definiowa adnych metod, moesz uy klasy Struct. Aby j zdefiniowa, wpisz Struct.new,
jako parametry podajc nazw struktury oraz zmiennych (jako symbole), jakie powinna zawiera:
Book = Struct.new('Book', :title, :author, :isbn)
152
Klasy
Uyj skadni z kropk do wywoania metod klasy
(rysunek 7.1):
hw.say_hello
Proste klasy
Rysunek 7.2. Pierwsza cz wywietla 75 metod, ktre mog by uyte z klas HelloWorld
(w ktrej zdefiniowano tylko jedn metod). Druga cz wywietla 42 metody,
ktre mog by wywoane na obiekcie HelloWorld
153
Rozdzia 7.
Aby utworzy klas:
1. Rozpocznij definiowanie klasy:
class Dog
Proste klasy
154
Klasy
4. Uyj klasy (rysunek 7.4):
trixie = Dog.new
trixie.speak
trixie.play
trixie.sleep
Wskazwki
Metody definiowane na zewntrz klasy, jak te
Proste klasy
Rysunek 7.4. Utworzenie obiektu klasy Dog i wywoanie kilku jego metod
155
Rozdzia 7.
Zmienne instancji
Zmienne instancji
def set_name(n)
@name = n
end
def get_name
@name
end
Rysunek 7.5. Jedna metoda setter i jedna metoda getter zostay dodane
do klasy Dog, by mie dostp do zmiennej @name
156
Klasy
Aby uywa zmiennych instancji:
1. Rozpocznij definiowanie nowej klasy:
class Circle
def get_radius
@radius
end
157
Zmienne instancji
def area
Math::PI * @radius**2
end
def perimeter
2 * Math::PI * @radius
end
Rozdzia 7.
6. Utwrz nowe koo oraz ustaw dugo promienia:
c = Circle.new
c.set_radius(4.59)
Wskazwki
Zmienne instancji s dostpne jedynie
Zmienne instancji
158
Klasy
Akcesory
Jak ju wspomniaem kilka razy w tej ksice,
jzyk Ruby zosta stworzony po to, aby wszystko
byo dla programisty atwe (albo przynajmniej
atwiejsze ni dotychczas). Skoro obecno
w klasach metod setter i getter jest powszechna,
jzyk Ruby posiada skrt uatwiajcy ich
tworzenie. Podczas definicji klasy przed
definiowaniem jakichkolwiek metod moesz uy
sw kluczowych attr_reader oraz attr_accesor,
aby wskaza zmienne, dla ktrych powinny
istnie metody setter i getter.
class NazwaKlasy
attr_accesor :var1, :var2, :var3
# inne metody
end
ale nie to
nazwa_obiektu.nazwa_zmiennej = warto
Akcesory
159
Rozdzia 7.
Aby uy akcesorw:
1. Dodaj akcesor do klasy Circle:
class Circle
attr_accessor :radius
end
(rysunek 7.10):
c = Circle.new
c.radius = 123.481
Akcesory
160
Klasy
Wskazwki
Metody setter i getter automatycznie
s rwnowane
def nazwazmiennej
@nazwazmiennej
end
def nazwazmiennej(warto)
@nazwazmiennej = warto
end
i caa reszta).
W jzyku Ruby istnieje rwnie metoda attr.
161
Akcesory
Rozdzia 7.
Konstruktory
W wikszoci jzykw zorientowanych obiektowo
istnieje metoda, ktra jest automatycznie
wywoywana podczas tworzenia obiektu klasy.
W innych jzykach nazywa j konstruktorem,
w jzyku Ruby okrela si je rwnie mianem
inicjalizatora (ang. initializer), poniewa jej nazwa
to zawsze initialize. (W jzyku Java i C++
konstruktor jest metod o takiej samej nazwie
jak nazwa klasy, do ktrej naley).
class NazwaKlasy
def initialize
# zrb cokolwiek
end
end
Konstruktory
class Dog
def initialize(name)
@name = name
end
end
d = Dog.new('Reksio')
162
Klasy
Aby utworzy konstruktor:
1. Rozpocznij definiowanie nowej klasy:
class Rectangle
attr_reader :height, :width
163
Konstruktory
def area
@height * @width
end
def perimeter
(@height + @width) * 2
end
Rozdzia 7.
4. Zdefiniuj jeszcze jedn metod (rysunek 7.13):
def is_square?
if @height == @width then
true
else
false
end
end
Konstruktory
164
Klasy
7. Uyj metod obiektu (rysunek 7.14):
puts "Prostokt o wysokoci #{r.height}
i szerokoci #{r.width} posiada obwd
dugoci #{r.perimeter}, a jego pole
wynosi #{r.area}."
puts "Prostokt ten #{r.is_square? ? 'jest' :
'nie jest'} kwadratem."
Konstruktory
165
Rozdzia 7.
Definiowanie operatorw
Tak jak obiekty posiadaj metody suce
do wykonywania rnych zada, tak samo mog
wykorzystywa operatory arytmetyczne,
przypisania i logiczne ktrych sposb dziaania
moesz zdefiniowa. Aby to zrobi, definiujesz
metod, ktrej nazwa jest operatorem: +, -, == itd.
Operatory takie wymagaj dwch argumentw
4 - 2, cig_znakw + inny_cig_znakw, wic
waciwa metoda musi operowa na dwch
obiektach. Pierwszym obiektem bdzie operand
z lewej strony (4 i cig_znakw w przedstawionym
przykadzie). Ten obiekt jest dostpny w metodzie
poprzez odwoanie do self (patrz rozdzia 6.,
Dziedziczenie i caa reszta) lub do zmiennych
instancji klasy. Operand z prawej strony (2 i inny_
cig_znakw) powinien by przyjmowany jako
jedyny argument metody:
Definiowanie operatorw
class NazwaKlasy
def *(rh)
# Rb co z self i rh
end
end
166
Klasy
Czy w tym przypadku wynikiem powinna by
suma pl prostoktw (200 + 48 = 248), czy suma
ich obwodw (60 + 28 =88)? By moe powinna
oblicza sum wysokoci i szerokoci prostoktw:
def +(rh)
@height += rh.height
@width += rh.width
self
end
167
Definiowanie operatorw
def +(rh)
Rectangle.new(@height +rh.height, @width +
rh.width)
end
Rozdzia 7.
W przeciwiestwie do poprzednich oglny operator Tabela 7.1. Powierzchnia cakowita
porwnania, <=>, nie jest automatycznie definiowany. szeroko dugo
Definiujc metod <=>, moesz sprawi, e obiekty 4
30
danego typu bdzie mona porwnywa i sortowa. 5.5
22
Po prostu zwracaj -1, jeli lewy operand jest
6
14
mniejszy, 1, jeli prawy operand jest mniejszy, i 0,
Powierzchnia cakowita
jeli s rwne. Na przykad jako podstaw do
porwnywania dwch obiektw typu Rectangle
wemy ich pola:
powierzchnia
120
121
84
325
def <=>(rh)
if self.area < rh.area then -1
elsif self.area > rh.area then 1
else 0 end
end
Definiowanie operatorw
Aby zrozumie poniszy stolarski przykad z ycia wzity, naley si mae wytumaczenie. W oryginale
autor uywa amerykaskiej miary drewna board foot. board foot deska o dugoci jednej stopy,
szerokoci jednej stopy i gruboci jednego cala lub odpowiednik o takiej samej kubaturze. rdo:
http://www.woodweb.com/knowledge_base/What_is_a_Board_Foot.html. Tak wic board foot jest miar
objtoci (kubatury), a nie powierzchni. Z tego powodu deski o rnych grubociach posiadaj rne
powierzchnie przy takiej samej objtoci proste. Autor zbija st przyp. tum.
168
Klasy
Listing 7.1. Klasa Wood umoliwiajca dodawanie
i porwnywanie obiektw typu Wood
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# Operator identyczno:
def ===(rh)
@boards == rh.boards
end
169
Definiowanie operatorw
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
Rozdzia 7.
3. Zdefiniuj metod add_board:
def add_board(board)
@boards.push(board)
end
Definiowanie operatorw
170
Klasy
6. Zdefiniuj operator dodawania:
def +(rh)
@boards += rh.boards
self
end
my_oak += your_oak
def double
copy = self.dup
copy.double!
end
171
Definiowanie operatorw
my_obj = SomeClassName.new
my_obj = my_obj.double!
Rozdzia 7.
Jeli lewy operand (biecy obiekt) ma mniejsz
powierzchni ni prawy operand, zwraca si -1.
Jeeli posiada wiksz, wwczas zwraca si 1.
Jeli oba maj tak sam powierzchni, zwraca
si 0 i przyjmuje si, e obiekty s rwne.
9. Zakocz definiowanie klasy i utwrz kilka
Definiowanie operatorw
172
Klasy
11. Do kilka desek dbowych:
oak += Wood.new({:width => 7, :length => 19},
{:width => 5.5, :length => 22.2})
173
Definiowanie operatorw
Rozdzia 7.
Wskazwki
Jeli potrzebujesz zdefiniowa
Definiowanie operatorw
def [](i)
case i
when 0, -2: @height
when 1, -1: @width
else nil
end
end
174
Klasy
Metody specjalne
Metody specjalne
175
Rozdzia 7.
Aby utworzy metody to_s i each:
1. Utwrz nowy skrypt w edytorze lub IDE
(listing 7.2):
# Skrypt 7.2 - groceries.rb
Metody specjalne
176
Klasy
Metoda each, bdca iteratorem, powinna
porusza si po elementach hasza i zwraca
wartoci do powizanego z ni bloku kodu.
(Iteratory zawsze korzystaj z yield i wywoywane
s z blokiem kodu, patrz rozdziay 5., Struktury
sterujce, i 6., Tworzenie metod).
Do poruszania si po elementach hasza
wykorzystuje si iterator each_pair. W kadym
kroku iteracji klucz i warto hasza zostan
przypisane zmiennym k i v bloku. Nastpnie
zostaj one zwrcone przez iterator (do bloku
kodu, w ktrym zostaa wywoana metoda).
Moe si to wydawa niepotrzebne, ale mona
to wytumaczy w ten sposb: @items jest haszem,
wic moe korzysta z metody each_pair (lub
each) klasy Hash; GroceryList nie jest haszem,
wic musi zdefiniowa wasn metod each
(nawet jeli ta korzysta z innego iteratora).
5. Zdefiniuj metod to_s:
def to_s
str = ''
@items.each_pair { |k, v| str += "#{k}:
#{v}, "}
str.slice(0, str.length - 2).to_s
end
177
Metody specjalne
Rozdzia 7.
6. Zakocz definicj klasy i utwrz obiekt tego typu:
end
g = GroceryList.new
znakw:
puts "Lista jako cig znakw=> " + g.to_s
wierszu:
Metody specjalne
Rysunek 7.20. Wynik wykonania skryptu groceries.rb w edytorze SciTE pod systemem Windows
178
Klasy
Wskazwki
Innym sposobem implementacji metody to_s
jest skorzystanie z metody each klasy:
def to_s
str = ''
self.each { |k, v| str +=
str.slice(0, str.length end
179
Metody specjalne
Rozdzia 7.
Rysunek 7.21. Rne rodzaje bdw, ktre mog wystpi, jeli metody
i operatory bd wywoywane z niewaciwymi typami lub operandami
180
Klasy
Na przykad zamy, e chcesz stworzy klas,
ktra bdzie generowaa tablice w jzyku HTML.
Klasa taka moe zamienia tablic na tablic
w HTML-u. Ale dlaczego nie mogaby zamienia
hasza albo zakresu? Tak naprawd dlaczego nie
mogaby zamienia obiektu typu GroceryList,
ktry rwnie jest list wartoci? To, czego taka
klasa naprawd wymaga, moe by dowolnym
obiektem posiadajcym iterator each. Aby sprawdzi
taki warunek, uyj metody respond_to?:
class HtmlTable
# Kod klasy.
def make_rows(data)
return nil unless data.respond_to?('each')
data.each { # blok kodu
end
end
181
Rozdzia 7.
Aby wykorzysta duck typing:
1. Utwrz nowy skrypt w edytorze lub IDE
(listing 7.3):
# Skrypt 7.3 - ducks.rb
182
Klasy
Listing 7.3. Skrypt, ktry korzysta z metod
instance_of? oraz responds_to? w celu kontroli,
jakie typy obiektw mog by ze sob uywane
cig dalszy
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# Utwrz obiekty:
r = Rectangle.new(32, 56)
c = Circle.new(8.4)
# Wywietl informacj o nich:
puts "Pole r wynosi #{r.area}. Pole c
wynosi #{c.area}."
# Wywietl wynik dodawania:
print "Wynik dodawania r + c: "
puts r + c
# Wywietl wynik porwnania:
print "Porwnanie r z c: "
puts r <=> c
183
Rozdzia 7.
8. Wywietl wynik dodawania obu figur:
print "Wynik dodawania r + c: "
puts r + c
Wskazwki
184