lab4_fam_ivt260x

advertisement
ФИО
Группа
Преподаватель
Срок сдачи
Оценка
Лабораторная работа №4
Геттеры и сеттеры
Ruby
Фам Тхи Тхань Хуен
ИВТ – 260
Дмитриев А.С.
Геттеры и сеттеры
Информация, хранящаяся в переменных объекта,
секретна и доступна только этому объекту. Но часто возникает
ситуация, когда нужно позволить сторонним объектам
считывать и/или менять значения этих переменных.
Например, хорошо бы позволить устанавливать
количество кофе (в чашках), которое должна сварить
кофемашина, и заодно проверять, какое оно сейчас. Для это
создается пара обычных методов: геттер и сеттер.
class CoffeeMachine
# геттер
def cups_count
@cups_count
end
# отдаем наружу (показываем) значение переменной
# сеттер
def cups_count=(count)
@cups_count = count
# присваиваем значение, пришедшее извне
end
end
1
Кстати, в Ruby есть очень удобный метод класса —
attr_accessor, который создаст эту пару методов на лету.
class CoffeeMachine
attr_accessor :cups_count
end
Имя сеттера вовсе не обязательно заканчивать символом =,
можно использовать, например:
class CoffeeMachine2
# неудобный сеттер
def set_cups_count(count)
@cups_count = count
end
end
но тогда присваивать значение придется так:
machine = CoffeeMachine2.new
machine.set_cups_count(1)
А вот если сеттер был задан со знаком равенства в конце
имени, Ruby добавляет к присваиванию ложку синтаксического
сахара:
machine = CoffeeMachine.new
machine.cups_count = 1 # то же, что и machine.cups_count=(1)
2
Этот синтаксический сахар, правда, может привести к
недоразумениям, потому что по умолчанию Ruby воспринимает
присваивание как команду инициализировать локальную
переменную.
class CoffeeMachine
attr_accessor :cups_count
def set_default_cups_count
cups_count = 1
end
end
:008 > nespresso = CoffeeMachine.new
=> #<CoffeeMachine:0x904d61c>
:009 > nespresso.set_default_cups_count
=> 1
:010 > nespresso.cups_count
=> nil
По этой причине у всех сеттеров обязательно нужно указывать
объект вызова, даже если этоself (если сеттер является
частным, где self указывать запрещено, Ruby делает
поблажку).
class CoffeeMachine
attr_accessor :cups_count
def set_default_cups_count
self.cups_count = 1
end
end
3
:008 > bosch = CoffeeMachine.new
=> #<CoffeeMachine:0x914801c>
:009 > bosch.set_default_cups_count
=> 1
:010 > bosch.cups_count
=> 1
4
Download