ФИО Группа Преподаватель Срок сдачи Оценка Лабораторная работа №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