Definiowanie klas
Część sekcji Programowanie obiektowe ścieżki Ruby w Coddy. Lekcja 2 z 57.
Klasa opisuje rodzaj obiektu: co wie i co potrafi. class Dog ... end deklaruje klasę, a Dog.new tworzy obiekt tej klasy, czyli instancję. Metodę zdefiniowaną za pomocą def wewnątrz klasy można wywołać dla każdej instancji:
class Dog
def speak
"Woof"
end
end
rex = Dog.new
puts rex.speak
puts rex.classWynik:
Woof
Dognew tworzy obiekt, a następnie wywołuje jego metodę initialize z argumentami przekazanymi do new. initialize konfiguruje obiekt, zwykle zapisując argumenty w zmiennych instancji, których nazwy zaczynają się od @:
class Dog
def initialize(name)
@name = name
end
def speak
"#{@name} says Woof"
end
end
puts Dog.new("Rex").speak
puts Dog.new("Bella").speakWynik:
Rex says Woof
Bella says WoofMetody przyjmują argumenty tak jak każda metoda w Ruby i zwracają wartość ostatniego wyrażenia. Każde wywołanie new tworzy osobny obiekt:
class Calculator
def add(a, b)
a + b
end
def average(numbers)
numbers.sum.to_f / numbers.size
end
end
calc = Calculator.new
puts calc.add(2, 3)
puts calc.average([1, 2, 3, 6])Wynik:
5
3.0Nazwy klas to stałe zapisane wielkimi literami w notacji CamelCase (BankAccount); nazwy metod i zmiennych zapisuje się w notacji snake_case (deposit_money). new sprawdza argumenty zgodnie z initialize, więc brakujący argument powoduje zgłoszenie ArgumentError:
class Point
def initialize(x, y)
@x = x
@y = y
end
end
begin
Point.new(1)
rescue ArgumentError => e
puts e.message
endWynik:
wrong number of arguments (given 1, expected 2)Wyzwanie
ŁatwyUzupełnij klasę Formatter. Jej metoda title(text) zwraca tekst, w którym każde słowo zaczyna się wielką literą (the hobbit daje The Hobbit), slug(text) zwraca słowa zapisane małymi literami i połączone za pomocą - (the-hobbit), a initials(text) zwraca pierwszą literę każdego słowa zapisaną wielką literą (TH).
Dostarczony kod tworzy jeden obiekt Formatter i dla każdej linii wejściowej wypisuje trzy wyniki w osobnych liniach.
Twój kod umieść w pliku formatter.rb. main.rb zawiera dostarczony kod wejścia/wyjścia i nie można go edytować.
Spróbuj swoich sił
require_relative 'formatter'
# Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
input = []
while (line = gets)
input << line.chomp
end
formatter = Formatter.new
input.each do |line|
puts formatter.title(line)
puts formatter.slug(line)
puts formatter.initials(line)
end
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Klasy i obiekty
Praca z plikamiDefiniowanie klasZmienne instancjiMetody i selfto_s i inspectPowtórzenie – karta biblioteczna4Hermetyzacja
Metody prywatneMetody chronionePrywatne setteryOchrona stanuPowtórzenie – automat vendingowy7Polimorfizm i typowanie kacze
PolimorfizmTypowanie kaczeMetody abstrakcyjnecase i klasyPowtórzenie – metody płatności10Wzorce projektowe, część 2
Delegowanie z ForwardableWzorzec dekoratoraWzorzec budowniczegoWzorzec stanu2Metody dostępowe i self
Gettery i setteryWłasne setteryself w metodachTożsamość i równośćPowtórzenie – lista kontaktów5Dziedziczenie
PodklasyNadpisywanie metodWywoływanie superis_a? i przodkowiePowtórka – lista płac pracowników8Metody specjalne
Równość i hashMetody operatorówIndeksowanie i dodawanieWłasne kolekcjePowtórka – ułamki11Projekt: Zarządzanie biblioteką
Książki i czytelnicyWypożyczanie książekPoćwicz samodzielnie: Kompilator Ruby online