Menu
Coddy logo textTech

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.speak

Wynik:

Rex says Woof
Bella says Woof

Metody 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.report

Wynik:

count is 2

Do 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
end

Wynik:

Rex
undefined method `age' for an instance of Dog

Zmienna 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_variables

Wynik:

nil
[:@on]
challenge icon

Wyzwanie

Łatwy

Uzupeł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
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator Ruby online