Zmienne instancji
Część sekcji Programowanie obiektowe ścieżki Ruby w Coddy. Lekcja 3 z 57.
Zmienna instancji zaczyna się od @ i należy do jednego obiektu. Wartość zapisana w initialize jest dostępna dla każdej metody tego obiektu, a każda instancja ma własną kopię:
class Dog
def initialize(name)
@name = name
end
def speak
"#{@name} says Woof"
end
end
rex = Dog.new("Rex")
bella = Dog.new("Bella")
puts rex.speak
puts bella.speakWynik:
Rex says Woof
Bella says WoofMetody mogą zmieniać zmienne instancji, dzięki czemu obiekt pamięta, co się z nim wydarzyło. Zmienne instancji obiektu razem tworzą jego stan:
class Counter
def initialize
@count = 0
end
def increment
@count += 1
end
def report
"count is #{@count}"
end
end
clicks = Counter.new
clicks.increment
clicks.increment
puts clicks.reportWynik:
count is 2Do zmiennych instancji nie można odwołać się spoza obiektu. Kod zewnętrzny może wywoływać tylko metody, więc klasa, która chce udostępnić wartość, definiuje metodę, która ją zwraca — metodę odczytującą:
class Dog
def initialize(name)
@name = name
end
def name
@name
end
end
rex = Dog.new("Rex")
puts rex.name
begin
rex.age
rescue NoMethodError => e
puts e.message
endWynik:
Rex
undefined method `age' for an instance of DogZmienna instancji, której nigdy nie przypisano wartości, ma wartość nil i nie powoduje błędu, więc błędnie wpisana nazwa po cichu odczytuje inną, pustą zmienną. instance_variables wyświetla zmienne, które obiekt rzeczywiście ma:
class Lamp
def initialize
@on = false
end
def status
@onn.inspect
end
end
lamp = Lamp.new
puts lamp.status
p lamp.instance_variablesWynik:
nil
[:@on]Wyzwanie
ŁatwyUzupełnij klasę Pet. initialize(name, species, age) przechowuje te trzy wartości, birthday dodaje jeden rok do wieku, a describe zwraca jedno zdanie: zwierzę o imieniu Rex, gatunku dog i wieku 3 daje Rex is a 3 year old dog.
Dostarczony kod tworzy obiekt Pet na podstawie pierwszych trzech wierszy wejścia (imię, gatunek, wiek), wywołuje birthday tyle razy, ile podano w czwartym wierszu, i wypisuje wynik describe.
Twój kod umieść w pliku pet.rb. Plik main.rb zawiera dostarczony kod wejścia/wyjścia i nie można go edytować.
Spróbuj swoich sił
require_relative 'pet'
# Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
input = []
while (line = gets)
input << line.chomp
end
pet = Pet.new(input[0], input[1], input[2].to_i)
input[3].to_i.times { pet.birthday }
puts pet.describe
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