Programowanie w Ruby Wykład 4 Marcin Młotkowski 29 października 2018
Plan wykładu 1 2 3 Marcin Młotkowski Programowanie w Ruby 100 / 430
Deklaracja klasy class Device Marcin Młotkowski Programowanie w Ruby 101 / 430
Konstruktor class Device def initialize(name, type) @name = name @type = type Marcin Młotkowski Programowanie w Ruby 102 / 430
Deklaracja metody class Device def initialize(name, type)... def to s @name + + @type Marcin Młotkowski Programowanie w Ruby 103 / 430
Utworzenie obiektu prive = Device.new( /dev/sdc, kingston ) puts prive.to s Marcin Młotkowski Programowanie w Ruby 104 / 430
Dygresja Konwencja # równoważne: puts prive.to s puts prive Marcin Młotkowski Programowanie w Ruby 105 / 430
Zmienne obiektu (zmienne instancyjne) Składnia @nazwa Zmienne instancyjne są prywatne. Marcin Młotkowski Programowanie w Ruby 106 / 430
Dostęp do zmiennych obiektu (akcesory) class Device def name @name def zmien nazwe(nowa) @name = nowa Marcin Młotkowski Programowanie w Ruby 107 / 430
Inny modyfikator class Device def name=(nowa) @name = nowa prive.name = Corsair Marcin Młotkowski Programowanie w Ruby 108 / 430
Deklaracja akcesorów Deklaracja class Device attr reader :name Równoważne class Device def name @name Marcin Młotkowski Programowanie w Ruby 109 / 430
Modyfikatory Zamiast pisać tak class Device def name=(nowa) @name = nowa Można napisać tak class Device attr writer :name Marcin Młotkowski Programowanie w Ruby 110 / 430
Akcesor odczyt/zapis class Device attr accessor :name Marcin Młotkowski Programowanie w Ruby 111 / 430
Atrybuty wirtualne class Device attr reader :name def long name @type + ---> + @name Użycie puts prive.name puts prive.long name Marcin Młotkowski Programowanie w Ruby 112 / 430
Atrybuty wirtualne Implementacja obiektu reprezentującego temperaturę class Temperatura attr reader :temperatura Marcin Młotkowski Programowanie w Ruby 113 / 430
Atrybuty wirtualne Implementacja obiektu reprezentującego temperaturę class Temperatura attr reader :temperatura Skale temperaturowe: Celsius Kelvin Fahrenheit Reamur Marcin Młotkowski Programowanie w Ruby 113 / 430
Skale temperaturowe class Temperatura attr accessor :kelvin def celsius=(c) @kelvin = 273.15 + c def celsius return @kelvin - 273.15 def fahrenheit=(f) @kelvin = (f - 32) * (5/9) + 273.15 def fahrenheit return (@kelvin - 273.15)*(9/5) + 32 Marcin Młotkowski Programowanie w Ruby 114 / 430
Przykłady użycia t = Temperatura.new t.kelvin = 273.15 puts Cels #{t.celsius}, fahr #{t.fahrenheit} Cels 0.0, fahr 32.0 Marcin Młotkowski Programowanie w Ruby 115 / 430
Metody singletonowe t = Temperatura.new t.kelvin = 273.15 Skala Reaumura def t.reaumur; (@kelvin - 273.15)*(5/4) puts t.reaumur Marcin Młotkowski Programowanie w Ruby 116 / 430
Zmienne i metody klasy (statyczne) class Device @@liczba = 0 def initialize @@liczba = @@liczba + 1 Marcin Młotkowski Programowanie w Ruby 117 / 430
Zmienne i metody klasy (statyczne) class Device @@liczba = 0 def initialize @@liczba = @@liczba + 1 def Device.licznik @@liczba.to s Marcin Młotkowski Programowanie w Ruby 117 / 430
Kontrola dostępu do pól i metod Zmienne klasy i obiektu są prywatne Metody klasy i obiektu są publiczne Marcin Młotkowski Programowanie w Ruby 118 / 430
Metody protected Można korzystać w podklasach Można korzystać w metodach obiektów tej samej klasy Składnia class Device protected def scan def block protected :block Marcin Młotkowski Programowanie w Ruby 119 / 430
Metody prywatne Można je wywoływać wyłącznie w postaci self.metoda prywatna Marcin Młotkowski Programowanie w Ruby 120 / 430
Deklarowanie podklasy class Printer < Device Marcin Młotkowski Programowanie w Ruby 121 / 430
Konstruktor w podklasie class Printer < Device def initialize(name, type, port) super(name, type) @port = port Marcin Młotkowski Programowanie w Ruby 122 / 430
Dziedziczenie i przykrywanie metod Przykład class Device def to s... class Printer < Device... iglowka = Printer.new( biurkowa, dot printer, PRN: ) puts iglowka # puts iglowka.to s Wynik biurkowa dot printer Marcin Młotkowski Programowanie w Ruby 123 / 430
Ulepszenie metody to s Pierwsza wersja class Printer < Device def to s super.to s + #{@port} Marcin Młotkowski Programowanie w Ruby 124 / 430
Ulepszenie metody to s Pierwsza wersja class Printer < Device def to s super.to s + #{@port} Druga wersja class Printer < Device def to s super + #{@port} Marcin Młotkowski Programowanie w Ruby 124 / 430
Na koniec o metodach Wszystkie metody są wirtualne. Marcin Młotkowski Programowanie w Ruby 125 / 430
Plan wykładu 1 2 3 Marcin Młotkowski Programowanie w Ruby 126 / 430
Co to jest mixin Mixin mechanizm włączania kodu modułu do deklaracji klasy Marcin Młotkowski Programowanie w Ruby 127 / 430
Przykład Zadanie Zdefinowanie modułu do odczytywania stanu obiektu Marcin Młotkowski Programowanie w Ruby 128 / 430
Implementacja modułu module Debugger def snapshot puts Stan obiektu klasy #{self.class} for iv in self.instance variables puts #{iv} = #{self.instance variable get(iv)} Marcin Młotkowski Programowanie w Ruby 129 / 430
Wmiksowanie modułu do klasy class Drukarka < Device include Debugger... Marcin Młotkowski Programowanie w Ruby 130 / 430
Zastosowanie lokalna = Drukarka.new( kuchenna, hp5000n, /dev/ ) lokalna.snapshot Marcin Młotkowski Programowanie w Ruby 131 / 430
Inne zastosowania Moduł (mixin) Comparable implementuje operatory porównania <, <=, ==, >=, > i metodę between? wymaga implementacji operatora <=> Marcin Młotkowski Programowanie w Ruby 132 / 430
Zastosowanie modułu Comparable class Wektor include Comparable def <=> (awektor) # zwraca -1 gdy self< awektor, 0 lub 1 Zastosowanie w1 = Wektor.new([3, -4, 5]) w2 = Wektor.new([-5, 12, -2]) w1 < w1 w1 >= w2 Marcin Młotkowski Programowanie w Ruby 133 / 430
Plan wykładu 1 2 3 Marcin Młotkowski Programowanie w Ruby 134 / 430
Wszystkie klasy są podklasami klasy Object Metody klasy Object class - klasa obiektu instance variables freeze to s i inne... Marcin Młotkowski Programowanie w Ruby 135 / 430
Chwila rozrywki (irb)> 5.class Fixnum Marcin Młotkowski Programowanie w Ruby 136 / 430
Chwila rozrywki (irb)> 5.class Fixnum (irb)> 5.class.class Class Marcin Młotkowski Programowanie w Ruby 136 / 430
Chwila rozrywki (irb)> 5.class Fixnum (irb)> 5.class.class Class (irb)> 5.class.class.class Class Marcin Młotkowski Programowanie w Ruby 136 / 430
Zmiana implementacji istniejącej klasy class Fixnum def to s return Niespodzianka! puts 5 Marcin Młotkowski Programowanie w Ruby 137 / 430
Zagnieżdżanie klasy w klasie class A class InA x = A::InA.new Marcin Młotkowski Programowanie w Ruby 138 / 430
Dostęp indeksowany class MyArray def [](i) return Zażądano #{i} def []=(i, v) puts [#{i}]= #{v} arr = MyArray.new arr[234] arr[34] = 16 Marcin Młotkowski Programowanie w Ruby 139 / 430