Переменные экземпляра
Часть раздела Объектно-ориентированное программирование путешествия по 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]Задание
ЛегкоЗавершите класс 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
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Классы и объекты
Работа с файламиОпределение классовПеременные экземпляраМетоды и selfto_s и inspectПовторение — читательский билет4Инкапсуляция
Приватные методыЗащищённые методыПриватные сеттерыЗащита состоянияПовторение — торговый автомат7Полиморфизм и утиная типизация
ПолиморфизмУтиная типизацияАбстрактные методыcase и классыПовторение — способы оплаты10Шаблоны проектирования, часть 2
Делегирование с помощью ForwardableШаблон декоратораШаблон строителяШаблон состояния2Аксессоры и self
Чтение и записьПользовательские сеттерыself в методахИдентичность и равенствоПовторение — список контактов5Наследование
ПодклассыПереопределение методовВызов superis_a? и предкиПовторение — расчёт зарплаты сотрудников8Специальные методы
Равенство и хешированиеМетоды операторовИндексация и добавлениеПользовательские коллекцииПовторение — дроби11Проект: Управление библиотекой
Книги и читателиВыдача книг3Методы и переменные классов
Методы классовПеременные экземпляра классаКонстантыФабричные методыПовторение — коды купонов6Модули и примеси
Модули и includeРасширение объектовМодуль ComparableМодуль EnumerableПовторение — спортивная лига9Паттерны проектирования. Часть 1
Паттерн «Одиночка»Фабричный паттернПаттерн «Наблюдатель»Паттерн «Стратегия»Потренируйтесь самостоятельно: Онлайн-компилятор Ruby