Menu
Coddy logo textTech

Переменные экземпляра

Часть раздела Объектно-ориентированное программирование путешествия по Ruby на Coddy. Урок 3 из 57.

Переменная экземпляра начинается с @ и принадлежит одному объекту. Значение, сохранённое в initialize, остаётся доступным для каждого метода этого объекта, и у каждого экземпляра есть собственная копия:

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

Вывод:

Rex says Woof
Bella says Woof

Методы могут изменять переменные экземпляра, поэтому объект помнит, что с ним произошло. Вместе его переменные экземпляра образуют состояние объекта:

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

Вывод:

count is 2

К переменным экземпляра нельзя обратиться извне объекта. Внешний код может только вызывать методы, поэтому класс, который хочет предоставить доступ к значению, определяет метод, возвращающий его, — метод чтения:

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

Вывод:

Rex
undefined method `age' for an instance of Dog

Переменная экземпляра, которой никогда не присваивалось значение, равна nil и не вызывает ошибок, поэтому имя с опечаткой незаметно обращается к другой пустой переменной. instance_variables перечисляет переменные, которые действительно есть у объекта:

class Lamp
  def initialize
    @on = false
  end

  def status
    @onn.inspect
  end
end

lamp = Lamp.new
puts lamp.status
p lamp.instance_variables

Вывод:

nil
[:@on]
challenge icon

Задание

Легко

Завершите класс Pet. initialize(name, species, age) сохраняет три значения, birthday добавляет один год к возрасту, а describe возвращает одно предложение: для питомца по имени Rex, вида dog и возраста 3 результатом будет Rex is a 3 year old dog.

Предоставленный код создаёт Pet из первых трёх строк ввода (имя, вид, возраст), вызывает birthday столько раз, сколько указано в четвёртой строке, и выводит результат describe.

Ваш код должен находиться в pet.rb. В main.rb содержится предоставленный код ввода/вывода, и его нельзя редактировать.

Попробуйте сами

require_relative 'pet'

# Предоставленный код ввода/вывода: оставьте его как есть
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 iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор Ruby