od Podstaw
5 godz. 10 min · Ruby · Full-stack i Programowanie
Małgorzata ŁyczywekSoftware engineerW pierwszych lekcjach Kursu przejdziemy do omówienia konfiguracji środowiska, by następnie poznać tryb interaktywny Rubiego. Stworzymy pierwsze programy oraz poznamy składnię języka. Dowiesz się między innymi tego, czym są zmienne, jakie istnieją typy danych, jak przekazywać własne dane do programu i jak na nich operować.
Programy oraz instrukcje potrafią w znaczny sposób przyspieszyć i ułatwić pracę w Ruby. Mogą wykonywać za nas powtarzające się czynności i podejmować decyzje. Dlatego też kolejnym, naturalnym krokiem nauki języka Ruby jest poznanie struktur sterujących kodem, takich jak instrukcje warunkowe if, case, pętle while, until, for, each czy inne iteratory.
W kolejnych lekcjach poznasz następne, bardziej rozbudowane zagadnienia. Będziemy korzystać z zaawansowanych struktur danych i metod, jakie możemy na nich wykonywać. Są to metody wbudowane, a więc dostępne domyślnie w Ruby. Przejdziemy do pisania własnych metod dbając, by nasz kod był zgodny z regułą DRY. Poznamy zagadnienia związane ze strukturami specyficznymi dla języka Ruby a także praktykami, jakie są w tym języku stosowane.
Dane do programów najczęściej dotaczane są z zewnętrznego źródła, jak na przykład pobierane z pliku. Przekonasz się jak wykonywać operację na plikach w Ruby - odczytywać, zapisywać, a także w jaki sposób radzić sobie z dużymi plikami w wydajny sposób. Dowiemy się również co zrobić, gdy nasz program spotka niespodziewany błąd. Zajmiemy się przewidywaniem i zapobieganiem błędów w kodzie.
Kolejna, najbardziej obszerna część kursu to dokładne omówienie podstaw paradygmatu programowania obiektowego. Nawet jeżeli wydaje Ci się to bardzo skomplikowane - niedługo wszystko stanie się jasne. Programowanie obiektowe pozwala nam na lepsze odwzorowanie rzeczywistości, czyli tworzenie bardziej praktycznego kodu. Przyjrzymy się jak obiektowość jest realizowana w Ruby oraz jak tworzyć obiekty, klasy i jakich zasad warto przestrzegać. Na koniec dowiemy się jak rozszerzać funkcjonalność istniejących klas za pomocą modułów.
Ten kurs został przygotowany z myślą o wszystkich, którzy chcą zacząć naukę programowania Ruby od podstaw. Stworzono go szczególnie dla osób, które z pisaniem kodu nie miały jeszcze styczności. Nie jest wymagana żadna wcześniejsza wiedza na temat programowania. Jeśli chcesz szybko nauczyć się programowania i myślisz, że twoim kierunkiem jest tworzenie aplikacji webowych, to Ruby jest świetnym wyborem na start.
2.6+
Kolejnym typem zmiennych są tablice haszujące tablice
asocjacyjne hashtable po prostu hash czasem nazywane również słownikami
a to struktura danych która przechowuje elementy według powiązanych
kluczy z wartościami możemy możemy po prostu taki
hash zdefiniować za pomocą nawiasów klamrowych jeżeli
sobie sprawdzę hash sprawdzę klasę class uruchomię
to pojawi mi się że moja zmienna hasz należy
do typu hash mogę sobie
utworzyć jakąś zmienną na przykład z koszykiem bucket
mój koszyk będzie zawierał jakieś owoce załóżmy
że będę miała apple dwukropek na co wskazuje mój klucz na
jakąś wartość założmy że mam 2 kg jabłek następnie
daje drugi klucz załóżmy jakieś
gruszki gruszek mam tylko kilogram znowu
może jakiś inny owoc akurat
wiśnie lubię wezmę sobie ich więcej i tak dalej i tak dalej może
jeszcze jakiś tam nasza tablica była dosyć duża czyli
stworzyłam sobie cztery elementy które są powiązane z
wartościami i o ile każdy element tutaj każdy klucz musi
być unikalny tak wartości mogą nam się powtarzać i mamy
tutaj 1 kg gruszki 1
kg czy tam w jedną sztukę dla naszego arbuza mogę
oczywiście wyświetlić sobie i jak
zapiszę uruchomię to pojawi mi się taka tablica jak widzimy te
tutaj klucze zostały zamienione na wartości symboli
ponieważ one w obrębie danego słownika są zawsze unikalne
mogę również wyświetlić sobie konkretny element na podstawie nazwy
czyli dla naszego tutaj koszyka mogę sprawdzić
element apple i zobaczę rzeczywiście
jego wartość to dwójka nasze klucze mogą
być dowolnego typu czyli mogę stworzyć sobie nowy
element w naszym słowniku po pierwsze jako kolejny symbol
powiedzmy że to będzie bardzo mieszany koszyk
więc sobie zrobię carrot i też ustawię jakąś wartość piątka
jak wyświetlę cały koszyk to zobaczysz
że w koszyku pojawiła mi się także marchewka mogę też
dodać do naszego koszyka element
który nie będzie symbolem czyli utworzę sobie na przykład brzoskwinia
niech ma jakąś wartość tam 23 kiedy
wykonam wyświetle cały
nasz koszyk to ostatni element metoda
p pokazała mi za pomocą cudzysłowów czyli udało mi się utworzyć taki
klucz który jest stringiem ale jak powiedziałam może być dowolnego typu
więc kolejny mój element utworze jako
na przykład po prostu 5 i
dodam mu jakąkolwiek wartość five wyświetlę
i teraz wyświetlę też cały nasz koszyk zobaczymy
że wartość five pojawiła się w koszyku gdzie kluczem jest wartość
liczbowa dwa różne hashe czy dwie różne tablice asocjacyjne
możemy ze sobą porównać zwykłym znakiem porównania czyli jeżeli
utworze sobie taki słownik taką strukturę
tablicy asocjacyjnej że będę miała a 1
b 2 i pod spodem drugi taki sam hash
nawet go skopiuje po prostu to
mogę sprawdzić że 2 hashe są takie same za pomocą zwykłego operatora
porównania czyli h1 równa się h2 i mogę
zobaczyć że wartość którą mi zwróciło to jest wartość prawda
kolejna rzecz mogę sobie stworzyć nową
tablicę asocjacyjną na podstawie tablicy dwuwymiarowej jeżeli
stworzę sobie jakąś zmienną która będzie przechowywała
dwuwymiarową tablicę załóżmy że to będzie tablica z tłumaczeniami
czyli będę miała apple i po przecinku
będę miała tłumaczenie czyli jabłko w
kolejnym wierszu będę miała pear
i jej tłumaczenie to gruszka no
i może jeszcze jedno zrobię sobie cherry i
tłumaczenie wiśnia czyli
to jest jakiś tam słownik angielsko-polski kiedy
sobie zobaczę ten słownik to rzeczywiście on powstał jako
tablica dwuwymiarowa a teraz mogę skorzystać z
to hash i kiedy wyświetlę to pojawi
mi się tablica dwuwymiarowa która te stringi sparowała
w formie klucz wartość czyli apple jest moim kluczem a
wartością tłumaczeniem jest jabłko mogę
też spokojnie sobie wyświetlić jeżeli sobie tu bym zrobiła przypisanie
tego nowego słownika już jako rzeczywiście
tablice asocjacyjne to mogę sobie wyświetlić element dict
apple naturalnie pojawi mi się po prostu tłumaczenie
mogę też dostać się do elementu który nie istnieje i podobnie
jak w innych językach próbować na przykład dostać się do brzoskwini
której nie mam w tłumaczeniu pojawi mi się wartość nil czyli po prostu brakuje
takiego elementu bardzo ważna uwaga jeżeli
mamy elementy w tablicy asocjacyjnej w naszym hashu nie możemy się do
nich dostawać po indeksach dlatego że w tej strukturze tu
w nawiasach klamrowych kwadratowych podajemy dokładną
wartość a nie indeks bo nie mamy indeksów więc tu
również uzyskamy wartość nil jeżeli byśmy
chcieli odezwać się do zera to musiałaby istnieć po prostu w strukturze naszego
pamiętamy hasha coś takiego że 0 ma
przypisaną jakąś wartość na przykład 0 w ten sposób
na pewno nie jest indeksem nie możemy z tego w taki sposób korzystać
to nie jest tablica to przyjrzyjmy się jeszcze innym
rzeczom związanym z tablicami asocjacyjnymi stworzę sobie
taki hash person i
dana osoba będzie miała różne wartości związane po prostu z
cechami czyli na przykład może mieć wzrost 175
może mieć jakąś wagę powiedzmy
65 może też mi jakiś wiek załóżmy
30 i kolor włosów utworzę
jako string możemy sobie stworzyć
osobę jej cechy wszystko razem zapisać wyświetlić oczywiście
person i
wyświetli nam się taki świeżo utworzony hash możemy
stworzyć sobie też drugą taką tablicę asocjacyjną more
info i w tej tablicy dodamy inne informacje
na przykład eyes i załóżmy że kolor
oczu utworzymy green możemy dać sobie czy
osoba ma ogon więc utworzę zmienną false bo
ludzie raczej nie mają ogonów i dalej możemy dodać gender
niech będzie mail czyli
mamy więcej informacji na temat typu naszej osoby jeżeli byśmy chcieli
te dwie informacje ze sobą połączyć to może was skusić użycie
plusa czyli person plus more
info ale takie łączenie
dwóch tablic asocjacyjnych nam nie zadziała musimy je zmerge'ować czyli
połączyć specjalną metodą merge merge person
z more info male w ogóle nie jest
w cudzysłowiu więc powinnam zrobić to
jeszcze raz sobie sprawdzimy że plusik na mnie zadziała tak
się nie da zrobić w ruby z resztą widzimy komunikat
który tutaj nie przeczytałam undefined method plus dla naszego dla
naszego hasha ale możemy skorzystać z metody merge
łączymy dwie tablice i
pojawi nam się jedna druga połączona z dwóch czyli
widzimy że tutaj pojawia się też już stan ogona brak oczy zielone
płeć mężczyzna no i możemy zobaczyć czy
te informacje zostały zachowane w person wyświetlimy
może tutaj dla czytelności znowu dodam sobie jakieś kreseczki
aha jak widzę nie zapisały się te zmiany
które wcześniej domerge'owałam za pomocą metody merge dlaczego
bo jeżeli bym chciała zapisać to musiałabym zrobić albo person
równa się zmiany albo
skorzystać z wykrzyknika czyli naszej metody która
mówi wykonaj się tu natychmiast jeśli teraz sobie zapiszę te zmiany uruchomię
to zobaczę że te dwie tablice przed i po są takie
same zmiany zostały zapisane kolejna
sprawa która jest związana w ogóle ze słownikami jest iterowanie
po hashu czyli chcemy sobie wyświetlić
w jakiś przyjemny sposób klucz wartość bo ten który teraz widzimy
na ekranie nie jest najprzyjemniejszy najbardziej dla użytkownika przyjazny możemy
więc sobie wziąć naszą zmienną person skorzystać z iteratora
each oczywiście otworzyć nasz
blok podać jakąś jakąś zmienną no i
przyjemnie będzie key value bo będziemy wiedzieć co jest kluczem co jest wartością
jest to dosyć czytelny zapis zamykamy
nasz blok i teraz możemy wyświetlić puts
key plus może zrobię sobie myślnik plus
value przyjrzyjcie się
uważnie tym kolejnym zmiennym jak widać tutaj
trafi nam się jakiś int int tutaj
zmienna false więc o ile te kolejne klucze
można było spokojnie może nawet wyświetlić chociaż
one są symbolami więc też by się przydało to string to value na
100% musimy zrobić to string jeśli chcemy skorzystać po
prostu złączenie za pomocą konkatenacji ale po co
robić taki długi kod kiedy mamy interpolację
czyli sobie otwieram cudzysłów hash
klamerki myślnik tutaj
też sobie hash klamerka zamykam
to już mi nie będzie potrzebne to string i zamykam całość
czyli teraz mam te dwie wartości w środku i
kiedy wykonam to mi się pojawi w bardzo przyjazny sposób wzrost waga
wiek kolor włosów tym hash dostarcza nam wiele
metod możemy na przykład usunąć jakąś informację z naszej tablicy zrobię
sobie żeby ta nasza tablica była dosyć długa więc może znowu ją zmerge'uję
czyli zrobię sobie person person
kropka merge i te dwie
tablice osocjacyjne ze sobą połączę następnie
będę chciała na przykład usunąć jakąś wartość czyli mogę na przykład
z człowieka usunąć informacje o wieku za pomocą metody
delete i podaję age
żeby się upewnić że rzeczywiście zostało usunięte no
to wyświetlę sobie przed i po czyli w tablicy
przed możemy zobaczyć że tu pojawia się age 30 a już w kolejnej
mamy wysokość wagę i od razu kolor włosów
nasza wartość age nasz klucz age wraz z
jego wartością został usunięty kolejna przydatna
metoda to jest metoda keys keys albo key
w ogóle więc w pierwszym momencie możemy sobie zrobić key
znak zapytania i sprawdzić czy age występuje cofnęłam
zmiany związane z usuwaniem więc jestem w stanie sprawdzić że ten
klucz rzeczywiście jest na liście zresztą mogę to sobie wyświetlić czyli
metodą kiss uzyskać listę wszystkich kluczy i mamy
taką tablicę kolejnych elementów podobnie
jak key i keys mogę sprawdzić value i values value
znak zapytania podać jaką wartość chcę sprawdzić to
chcę sprawdzić czy występuje wartość może 75
i jeżeli sprawdzę to rzeczywiście wartość 75 istnieje
mogę też sprawdzić green ponieważ tutaj za pomocą
merge z wykrzyknikiem połączyliśmy dwie te tablice asocjacyjne i
rzeczywiście green również się znajduję i podobnie jak poprzednio
mogę wykonać person i wziąć zwrócić sobie wszystkie wartości które
występują w tym w słowniku w tej tablicy i rzeczywiście mam 175
65 30 brown green false male kolejna
rzecz którą mogę sobie wykonać to zwróćcie uwagę jak
to tutaj zadziała nam metoda include czyli mogę na person
wykonać metodę include znak zapytania
i powiedzmy sprawdzić eyes i eyes
sprawdziło mi rzeczywiście występuje w całej
tej tablicy asocjacyjnej ale jeżeli podam je w stringu to
uzyskamy false ponieważ domyślnie słownik przechowuje
klucze jako symbole możemy
też sprawdzić jaką wielkość ma nasz słownik czyli wziąć słownik
size i dostaniemy wynik 7 nasz
słownik zawiera 7 par klucz wartość kolejną
metodą którą warto poznać w kontekście naszego słownika jest metoda
select select możemy
sobie znowu zrobić do key value
i następnie sprawdzić key równa
się eyes i zakończyć
zobaczmy jak ona zadziała zwróciła nam enumerator
enumerator select select zwraca nam nowy hash wszystkie pary
klucz wartość które po przejściu przez dany blok będą miały wartość true czyli
zwróciło nam zwróciłyby nam tylko i wyłącznie oczy jeżeli sobie utworzę
jakąś nową wartość tutaj nowy hash i
przypiszę to co tu się wykonało wyświetle hash to
pokaże nam tylko eyes wskazuje na green ten enumerator przeszedł
po wszystkich tych kluczach wartość i zwrócił tylko jedną taką parę która
rzeczywiście spełnia ten warunek tutaj aż się
prosi żeby zmienić na jednolinijkowy przyjemny rubiowy
zapis i teraz wyraźnie widzimy
to przypisanie do hash select i co wybieramy
wybieramy tam gdzie klucz będzie miał wartość eyes kolejna
ciekawostka że value nie jest wykorzystywane więc możemy
zamienić na podkreślenie to będzie od razu sugerowało że mimo
że potrzebujemy obu tych wartości żeby select zadziałał to ta druga
nie będzie w ogóle wykorzystywana kolejna metoda którą
chcę wam pokazać to metoda fetch czyli person kropka
fetch i podam na przykład
hair i wykonam od razu ta metoda mi
sprawdzi i zwróci klucz jeśli ten klucz istnieje
teoretycznie mogłabym to samo po prostu zrobić w kwadratowych
nawiasach ale jeżeli skorzystam z tej
metody i podam jej na przykład
nieistniejący klucz niech będzie name to metoda
ta zwróci nam błąd że klucz nie istnieje
w danym słowniku gdybyśmy to samo zrobili
za pomocą tutaj nawiasów kwadratowych
to metoda po prostu zwróciła nil czasami chcemy dostać informację
o błędzie i w takim wypadku ta metoda nam się sprawdzi co
więcej jeżeli nie istnieje czyli wezmę sobie person jeszcze raz ten
fetch i tutaj podam
name mogę jako drugi parametr podać co ma się wyświetlić w błędzie
i na przykład będzie no such key czyli
teraz jak tą metodę wykonam to zamiast uzyskać błąd dostanę po prostu string
no such key więc mogę sobie ten błąd
przyjemnie w łatwy sposób obsłużyć i coś wyświetlić zamiast błędu
mamy jeszcze dla hash dla naszych tablic asocjacyjnych taką
metodę która nam pozwala na rzutowanie czy też konwersję typu możemy
sobie naszą osobę person zrzutować na zwykłą
tablicę jeżeli tak zrobię to powstanie mi ta dwuwymiarowa tablica gdzie pierwszym
elementem jest nasz klucz oczywiście jako symbol drugim
jest wartość jeżeli bym chciała utworzyć tablice jednowymiarową
czyli wszystkie te elementy wrzucić ciągiem to potrzebuję innej
metody jest to metoda flatten która spłaszcza nasze tablice flatten
wykonam i ta druga tablica jest po prostu płaska widzimy
nie ma tych drugich więc rzeczywiście jest klucz wartość klucz wartość po przecinku
wszystkie jako jednowymiarowa tablica możemy też jeszcze nasze elementy
po prostu zamienić miejscami więc person użyję invert wykonam
i teraz moja wartość stała się kluczem a
klucz stał się wartością czyli jej wartość 175 ta
która tu była wartością zaczęła wskazywać na symbol wzrost jeżeli
kończymy pracę i chcemy na przykład mieć pewność że nasza tablica
została oczyszczona nie ma w niej już żadnych elementów to naszą tablicę asocjacyjną
możemy wyczyścić za pomocą metody clear i kiedy wyświetlimy
ponownie person to zostało usunięte jeszcze
raz wyświetliłam więc clear wykonuje się od razu w miejscu nie trzeba żadnego
wykrzyknika po prostu od razu czyści nam tablicę i już
ponownie wyświetlona jest ona pusta chciałabym wam pokazać
jeszcze jedną w sumie ostatnią rzecz związaną z naszą osobą to
each with object bardzo przydatna i bardzo często używana metoda
może pokażę ją na prostszej wersji czyli
na przykład zrobię sobie najpierw jakąś
tablicę będzie ona miała elementy a b i c mogę
wykonać each with object podać
jakiego typu będzie obiekt ja chcę mieć tutaj moją
tablicę asocjacyjną nasz hash następnie robię
do no i podaję dwa elementy tylko teraz mam each
with object więc pierwszy to jest item a drugi to
jest jakiś obiekt ten obiekt który podam tutaj więc żeby było to czytelne podam
sobie po prostu hash przechodzę do nowej linii i
dla naszego obiektu hash podaję
klucz moim kluczem będzie item a wartością będzie item
może upcase oczywiście end żeby
zamknąć blok i teraz każdy z tych elementów zostanie zebrany tak
jak zawsze robi to each przekazany jako item drugi zaś będzie
coś zbierał będzie tam naszym koszyczkiem do którego dorzucamy
elementy więc do naszego hasha pod kluczem item
pod kluczem po kolei o wartościach będzie to prostu klucz
a klucz b klucz c przypisujemy wartość też
abc ale wykonaj metodą upcase żeby to wyświetlić
musimy sobie cały ten całą tą linię przypisać do jakiejś zmiennej czyli storzę sobie
po prostu zmienną h że to po prostu hash tutaj mam
trochę za mało mi się wyświetla ale myślę
że widać albo to sobie skrócę item i po prostu tu
zamiast item będzie i żebyśmy wszystko ładnie widzieli na ekranie a
następnie zrobię p hash żeby
wyświetlić co nam powstało no i rzeczywiście each
with object stworzył nam nowy hash który ma jako klucz a a
jako wartość a większe i tak po kolei z każdą
literą i to będzie tyle na tą lekcję
a jeżeli chcecie poznać więcej metod dotyczących hashy czyli tablic
asocjacyjnych zajrzyjcie do dokumentacji
each_with_object · 6 min
h = ['a', 'b', 'c'].each_with_object({}) do |i, hash|
hash[i] = i.upcase
end
p hrzutowanie · 5 min
person = {
height: 175,
weight: 65,
age: 30,
hair: "brown"
}
more_info = {
eyes: "green",
tail: false,
gender: "male"
}
person.merge!(more_info)
p person.to_a
p person.to_flatten
p person.invert
p person.clear
p personmetody_hash · 4 min
person = {
height: 175,
weight: 65,
age: 30,
hair: "brown"
}
more_info = {
eyes: "green",
tail: false,
gender: "male"
}
person.merge!(more_info)
delete(:age)
p person
p person.key?(:age)
p person.key?(:hair)
p person.keys
p person.value?(:hair)
p person.values
p person.include?(:eyes)
p person.include('eyes')
p person.size
hash = person.select { |key, _| key == :eyes }
p hash
p person.fetch(:hair)
p person.fetch(:name, "No such key")dodawanie_hash · 3 min
person = {
height: 175,
weight: 65,
age: 30,
hair: "brown"
}
more_info = {
eyes: "green",
tail: false,
gender: "male"
}
# p person + more_info błąd!
p person.merge(more_info)
p person
p person.merge!(more_info)
p person
person.each do |key, value|
puts "#{key} - #{value}"
endtablica_hash · 2 min
dict = [
['apple', 'jablko'],
['pear', 'gruszka'],
['cherry', 'wisnia']
]
dict = dict.to_h
p dict['apple']
p dict['peach']
p dict[0]
p dict.clear
p dicthash_intro · 1 min
bucket = {
apple: 2,
pear: 1,
cherry: 3,
watermelon: 1
}
p bucket
p bucket[:apple]
p bucket[:carrot] = 5
p bucket
p bucket['peach'] = 23
p bucket[5] = "five"
p bucket