Programowanie obiektowe Język programowania Ruby Marcin Młotkowski 12 kwietnia 2018
Plan wykładu 1 Wstęp 2 Typy numeryczne Łańcuchy znaków (klasa String) Przedziały Tablice i tablice asocjacyjne Nazwy zmiennych 3 4 Przypisania Instrukcje warunkowa Pętle 5 Deklaracja klasy Marcin Młotkowski Programowanie obiektowe 312 / 391
Dlaczego Ruby Wstęp Ortodoksyjny język obiektowy ("wszystko jest obiektem"). Marcin Młotkowski Programowanie obiektowe 313 / 391
Ruby Wstęp Główne cechy języka Język skrajnie obiektowy; dynamiczny system typów (skryptowy); mechanizm domieszkowania klas (mix ins); cechy języków funkcjonalnych; kontynuacje; i sporo innych... Marcin Młotkowski Programowanie obiektowe 314 / 391
Autorstwo Wstęp Yukihiro Matsumoto (Matz) Marcin Młotkowski Programowanie obiektowe 315 / 391
Uruchamianie programów Tryb interaktywny $ ruby puts "A kuku!" ˆD $ irb # albo jirb irb(main):001:0> Marcin Młotkowski Programowanie obiektowe 316 / 391
Uruchamianie programów Tryb interaktywny $ ruby puts "A kuku!" ˆD $ irb # albo jirb irb(main):001:0> Wykonywanie programów $ ruby plik.rb Marcin Młotkowski Programowanie obiektowe 316 / 391
Dokumentacja Wstęp $ ri Fixnum Marcin Młotkowski Programowanie obiektowe 317 / 391
Typy numeryczne Łańcuchy znaków (klasa String) Przedziały Tablice i tablice asocjacyjne Nazwy zmiennych Plan wykładu 1 Wstęp 2 Typy numeryczne Łańcuchy znaków (klasa String) Przedziały Tablice i tablice asocjacyjne Nazwy zmiennych 3 4 Przypisania Instrukcje warunkowa Pętle 5 Deklaracja klasy Marcin Młotkowski Programowanie obiektowe 318 / 391
Klasa Fixnum, Bignum, Float Typy numeryczne Łańcuchy znaków (klasa String) Przedziały Tablice i tablice asocjacyjne Nazwy zmiennych liczby są prawdziwymi obiektami; dostępne są standardowe operatory arytmetyczne Marcin Młotkowski Programowanie obiektowe 319 / 391
Literały Wstęp Typy numeryczne Łańcuchy znaków (klasa String) Przedziały Tablice i tablice asocjacyjne Nazwy zmiennych literały proste Ala ma kota literały bardziej skomplikowane "Ala ma #{2+2} koty" i jeszcze inne Marcin Młotkowski Programowanie obiektowe 320 / 391
Operowanie napisami Typy numeryczne Łańcuchy znaków (klasa String) Przedziały Tablice i tablice asocjacyjne Nazwy zmiennych + mnóstwo innych Marcin Młotkowski Programowanie obiektowe 321 / 391
Przedziały Wstęp Typy numeryczne Łańcuchy znaków (klasa String) Przedziały Tablice i tablice asocjacyjne Nazwy zmiennych Literały: 1..10 1, 2,..., 10 a... d a, b, c Marcin Młotkowski Programowanie obiektowe 322 / 391
Zastosowanie przedziałów Typy numeryczne Łańcuchy znaków (klasa String) Przedziały Tablice i tablice asocjacyjne Nazwy zmiennych Test zawierania: (1..10) === 5 true ( a.. j ) === z false Marcin Młotkowski Programowanie obiektowe 323 / 391
Typy numeryczne Łańcuchy znaków (klasa String) Przedziały Tablice i tablice asocjacyjne Nazwy zmiennych Deklarowanie i odwołania do tablic zwierzątka = [ kotek, 1024, piesek, 3.1415 ] zwierzątka[2] piesek Marcin Młotkowski Programowanie obiektowe 324 / 391
Typy numeryczne Łańcuchy znaków (klasa String) Przedziały Tablice i tablice asocjacyjne Nazwy zmiennych Deklarowanie tablic asocjacyjnych słownik = { jeden => one, dwa => two, trzy => three } słownik[ dwa ] two Marcin Młotkowski Programowanie obiektowe 325 / 391
Konwencje w Ruby Wstęp Typy numeryczne Łańcuchy znaków (klasa String) Przedziały Tablice i tablice asocjacyjne Nazwy zmiennych $zmienna @zmienna @@zmienna Zmienna zmienna zmienna globalna zmienna obiektu zmienna klasy (statyczna) stała, nazwa klasy lub modułu zmienna lokalna, parametry i nazwy metod Marcin Młotkowski Programowanie obiektowe 326 / 391
Plan wykładu 1 Wstęp 2 Typy numeryczne Łańcuchy znaków (klasa String) Przedziały Tablice i tablice asocjacyjne Nazwy zmiennych 3 4 Przypisania Instrukcje warunkowa Pętle 5 Deklaracja klasy Marcin Młotkowski Programowanie obiektowe 327 / 391
Definicja prawdy Wstęp Prawdziwa jest każda wartość, która nie jest nil ani false. Marcin Młotkowski Programowanie obiektowe 328 / 391
Spójniki logiczne Wstęp and, &&, or,, not,! Marcin Młotkowski Programowanie obiektowe 329 / 391
Wartość wyrażenia logicznego Wartością wyrażenia logicznego jest wartość tego argumentu, który determinuje prawdę lub fałsz. Marcin Młotkowski Programowanie obiektowe 330 / 391
Wartość wyrażenia logicznego Wartością wyrażenia logicznego jest wartość tego argumentu, który determinuje prawdę lub fałsz. nil and true false and true nil false 1024 and false false 1024 and nil nil 1024 and "napis" "napis" Marcin Młotkowski Programowanie obiektowe 330 / 391
Zastosowanie Wstęp lista[klucz] = [ ] jest równoważne lista[klucz] = lista[klucz] [ ] Marcin Młotkowski Programowanie obiektowe 331 / 391
Operatory logiczne Wstęp == sprawdzenie równości <, <=, >=, > standardowe operatory arytmetyczne Marcin Młotkowski Programowanie obiektowe 332 / 391
Operator defined? Wstęp defined? 1 defined? niezdefinowana defined? printf "expression" nil "method" Marcin Młotkowski Programowanie obiektowe 333 / 391
Przypisania Instrukcje warunkowa Pętle Plan wykładu 1 Wstęp 2 Typy numeryczne Łańcuchy znaków (klasa String) Przedziały Tablice i tablice asocjacyjne Nazwy zmiennych 3 4 Przypisania Instrukcje warunkowa Pętle 5 Deklaracja klasy Marcin Młotkowski Programowanie obiektowe 334 / 391
Przypisania Instrukcje warunkowa Pętle Instrukcje, a właściwie wyrażenia Większość instrukcji można traktować jak wyrażenia. Marcin Młotkowski Programowanie obiektowe 335 / 391
Przypisania Instrukcje warunkowa Pętle Instrukcja (wyrażenie) przypisania x = 2 + 2 Marcin Młotkowski Programowanie obiektowe 336 / 391
Przypisania Instrukcje warunkowa Pętle Instrukcja (wyrażenie) przypisania x = 2 + 2 a = b = c = 2 * 2 Marcin Młotkowski Programowanie obiektowe 336 / 391
Przypisania Instrukcje warunkowa Pętle Instrukcja (wyrażenie) przypisania x = 2 + 2 a = b = c = 2 * 2 a, b = b, a Marcin Młotkowski Programowanie obiektowe 336 / 391
Schemat instrukcji złożonej Przypisania Instrukcje warunkowa Pętle Instrukcja... Marcin Młotkowski Programowanie obiektowe 337 / 391
Instrukcja if, 1. postać Przypisania Instrukcje warunkowa Pętle if warunek instrukcja Marcin Młotkowski Programowanie obiektowe 338 / 391
Instrukcja if, 2. postać Przypisania Instrukcje warunkowa Pętle if warunek instrukcja else instrukcja Marcin Młotkowski Programowanie obiektowe 339 / 391
Instrukcja if, 2. postać Przypisania Instrukcje warunkowa Pętle if warunek instrukcja else instrukcja if warunek then instrukcja else instrukcja Marcin Młotkowski Programowanie obiektowe 339 / 391
Instrukcja if, 2. postać Przypisania Instrukcje warunkowa Pętle if warunek instrukcja else instrukcja if warunek then instrukcja else instrukcja if warunek: instrukcja else instrukcja Marcin Młotkowski Programowanie obiektowe 339 / 391
Instrukcja if, 3. postać Przypisania Instrukcje warunkowa Pętle if warunek instrukcja elsif warunek instrukcja else instrukcja Marcin Młotkowski Programowanie obiektowe 340 / 391
Instrukcja if w roli wyrażenia Przypisania Instrukcje warunkowa Pętle abs = if x < 0 -x else x Marcin Młotkowski Programowanie obiektowe 341 / 391
Skrócona postać instrukcji if Przypisania Instrukcje warunkowa Pętle print suma if suma > 0 print suma unless suma == 0 Marcin Młotkowski Programowanie obiektowe 342 / 391
Instrukcja case, 1. postać Przypisania Instrukcje warunkowa Pętle przestepny = case when rok % 400 == 0: true when rok % 100 == 0: false else rok % 4 == 0 Marcin Młotkowski Programowanie obiektowe 343 / 391
Instrukcja case, 2. postać Przypisania Instrukcje warunkowa Pętle case polecenie when "exit", "quit" exit when "run" init() start() else print "Nieznane polecenie #{polecenie}" Marcin Młotkowski Programowanie obiektowe 344 / 391
Pętle Wstęp Przypisania Instrukcje warunkowa Pętle while warunek... unless warunek... Marcin Młotkowski Programowanie obiektowe 345 / 391
Przypisania Instrukcje warunkowa Pętle Pętle while warunek... unless warunek... Postać skrócona a *= 2 while a < 100 delta = delta - 10 unless delta < 0 Marcin Młotkowski Programowanie obiektowe 345 / 391
Powtarzanie Wstęp Przypisania Instrukcje warunkowa Pętle 3.times do print "Hop!\n" Marcin Młotkowski Programowanie obiektowe 346 / 391
Przypisania Instrukcje warunkowa Pętle 3.times do x print "Hop!\n" 0.upto(9) do x print " ", x Marcin Młotkowski Programowanie obiektowe 347 / 391
Iteracja po kolekcjach Przypisania Instrukcje warunkowa Pętle [ 2, 3, 5, 7, 11].each { val print val, " "} Marcin Młotkowski Programowanie obiektowe 348 / 391
Deklaracja klasy Dziedziczenie Kontrola dostępu Zmienne i metody klasy (statyczne) Rozszerzanie istniejących klas Plan wykładu 1 Wstęp 2 Typy numeryczne Łańcuchy znaków (klasa String) Przedziały Tablice i tablice asocjacyjne Nazwy zmiennych 3 4 Przypisania Instrukcje warunkowa Pętle 5 Deklaracja klasy Marcin Młotkowski Programowanie obiektowe 349 / 391
Deklaracja klasy Dziedziczenie Kontrola dostępu Zmienne i metody klasy (statyczne) Rozszerzanie istniejących klas Wszystkie klasy dziedziczą po klasie Object. Marcin Młotkowski Programowanie obiektowe 350 / 391
Klasa reprezentująca książkę Deklaracja klasy Dziedziczenie Kontrola dostępu Zmienne i metody klasy (statyczne) Rozszerzanie istniejących klas class Ksiazka def initialize(tytul, autor, wydawca) @tytul = tytul @autor = autor @wydawca = wydawca Marcin Młotkowski Programowanie obiektowe 351 / 391
Tworzenie obiektu Wstęp Deklaracja klasy Dziedziczenie Kontrola dostępu Zmienne i metody klasy (statyczne) Rozszerzanie istniejących klas obiekt = Ksiazka.new( Pan Tadeusz, Mickiewicz, Toruń ) print obiekt.to_s #<Ksiazka:0x3f4b21> Marcin Młotkowski Programowanie obiektowe 352 / 391
Implementacja metod Deklaracja klasy Dziedziczenie Kontrola dostępu Zmienne i metody klasy (statyczne) Rozszerzanie istniejących klas class Ksiazka def initialize(tytul, autor, wydawca) @tytul = tytul @autor = autor @wydawca = wydawca def tytul @tytul Marcin Młotkowski Programowanie obiektowe 353 / 391
Implementacja metod Deklaracja klasy Dziedziczenie Kontrola dostępu Zmienne i metody klasy (statyczne) Rozszerzanie istniejących klas class Ksiazka def initialize(tytul, autor, wydawca) @tytul = tytul @autor = autor @wydawca = wydawca def tytul @tytul Odwołanie do metody k = Ksiazka.new( Pan Tadeusz, Mickiewicz, Toruń ) k.tytul() k.tytul Marcin Młotkowski Programowanie obiektowe 353 / 391
Metody "specjane" Wstęp Deklaracja klasy Dziedziczenie Kontrola dostępu Zmienne i metody klasy (statyczne) Rozszerzanie istniejących klas class Temperatura def initialize(temp) @celsjusz = temp Marcin Młotkowski Programowanie obiektowe 354 / 391
Metody "specjane" Wstęp Deklaracja klasy Dziedziczenie Kontrola dostępu Zmienne i metody klasy (statyczne) Rozszerzanie istniejących klas class Temperatura def initialize(temp) @celsjusz = temp def fahrenheit 32.0 + (9.0/5.0)*@celsjusz Marcin Młotkowski Programowanie obiektowe 354 / 391
Metody "specjane" Wstęp Deklaracja klasy Dziedziczenie Kontrola dostępu Zmienne i metody klasy (statyczne) Rozszerzanie istniejących klas class Temperatura def initialize(temp) @celsjusz = temp def fahrenheit 32.0 + (9.0/5.0)*@celsjusz def fahrenheit=(temp) @celsjusz = (5.0/9.0)*(temp - 32) Marcin Młotkowski Programowanie obiektowe 354 / 391
Wirtualny atrybut Wstęp Deklaracja klasy Dziedziczenie Kontrola dostępu Zmienne i metody klasy (statyczne) Rozszerzanie istniejących klas temp = Temperatura.new(36.6) temp.fahrenheit 97.88 temp.fahrenheit = 32 Marcin Młotkowski Programowanie obiektowe 355 / 391
Składnia Wstęp Deklaracja klasy Dziedziczenie Kontrola dostępu Zmienne i metody klasy (statyczne) Rozszerzanie istniejących klas class Cwiczenia < Ksiazka def initialize(tytul, autor, wydanie, cena) super(tytul, autor, wydanie) @cena = cena def to_s super+ @cena.to_s Marcin Młotkowski Programowanie obiektowe 356 / 391
Pola Wstęp Deklaracja klasy Dziedziczenie Kontrola dostępu Zmienne i metody klasy (statyczne) Rozszerzanie istniejących klas Pola obiektów są prywatne. Marcin Młotkowski Programowanie obiektowe 357 / 391
Rodzaje metod Wstęp Deklaracja klasy Dziedziczenie Kontrola dostępu Zmienne i metody klasy (statyczne) Rozszerzanie istniejących klas metody publiczne domyślnie metody są publiczne, z wyjątkiem initialize; metody chronione są to metody, do których dostęp mają tylko obiekty tej samej klasy i klas potomnych; metody prywatne dostęp jest jedynie w kontekście bieżącego obiektu. Marcin Młotkowski Programowanie obiektowe 358 / 391
Definiowanie dostępu do metod Deklaracja klasy Dziedziczenie Kontrola dostępu Zmienne i metody klasy (statyczne) Rozszerzanie istniejących klas class Klasa def metoda1 private def metoda2 def metoda3 protected def metoda4 def metoda5 Marcin Młotkowski Programowanie obiektowe 359 / 391
Zmiennna klasy Wstęp Deklaracja klasy Dziedziczenie Kontrola dostępu Zmienne i metody klasy (statyczne) Rozszerzanie istniejących klas class Klasa @@licznik = 0 def initialize @@licznik += 1 Marcin Młotkowski Programowanie obiektowe 360 / 391
Metody statyczne Wstęp Deklaracja klasy Dziedziczenie Kontrola dostępu Zmienne i metody klasy (statyczne) Rozszerzanie istniejących klas class Klasa @@licznik = 0 def initialize @@licznik += 1 def Klasa.info print "Jest #{@@licznik} obiektów tej klasy" Marcin Młotkowski Programowanie obiektowe 361 / 391
Jak to zrobić Wstęp Deklaracja klasy Dziedziczenie Kontrola dostępu Zmienne i metody klasy (statyczne) Rozszerzanie istniejących klas Już zadeklarowane klasy można rozszerzać Marcin Młotkowski Programowanie obiektowe 362 / 391
Jak to zrobić Wstęp Deklaracja klasy Dziedziczenie Kontrola dostępu Zmienne i metody klasy (statyczne) Rozszerzanie istniejących klas Już zadeklarowane klasy można rozszerzać Przykład class Fixnum def next self+ 1 Marcin Młotkowski Programowanie obiektowe 362 / 391