5.5 KiB
		
	
	
	
	
	
	
	
			
		
		
	
	title, localeTitle
| title | localeTitle | 
|---|---|
| Classes and Objects | Классы и объекты | 
Классы и объекты
Объекты в Ruby
Давайте быстро перейдем к объектам Ruby. В реальном мире объекты могут быть любыми, включая автомобиль, компьютер или даже человека. Каждый из этих объектов имеет состояние и поведение.
Учитывая автомобиль, его состояние можно охарактеризовать как его модель, рисунок и цвет. Поведение автомобиля может быть поворотным, гудение или торможение.
Объект в Ruby имеет очень схожие характеристики. Объекты Ruby также имеют состояние и поведение. В Ruby Objects состояние хранится в переменных экземпляра, и поведение сохраняется в функциях.
Классы в Ruby
Класс - это в основном шаблон программы. Этот шаблон определяет начальные properties с использованием instance variables . Опять же, есть также и behaviors определяемое в виде функций.
Новый экземпляр класса создается с использованием метода initialize класса.
Возьмем, к примеру, следующий пример кода класса:
class Car 
    def initialize(make, model, color) 
        @make = make 
        @model = model 
        @color = color 
    end 
 
    def turn(direction) 
    end 
 
    def honk 
        puts "beep beep" 
    end 
 
    def brake 
    end 
 end 
Как вы видели, классы определяются с помощью class ключевого слова и блок кода класса заканчивается end keywork. Функция. .initialize - это конструктор. Когда мы создаем этот объект, мы определяем атрибуты @make , @model и @color со значениями, которые мы передаем в конструктор.
Создание экземпляра класса
Теперь, чтобы создать экземпляр этого класса, вам нужно только вызвать функцию .new .
mazda3 = Car.new('Mazda', 'Mazda3', 'White') 
Это здорово, но иногда вам может понадобиться изменить некоторые из этих атрибутов! Большинство этих атрибутов в этом примере будут статическими. Все же, представьте, что вы решили получить новую краску. Как вы собираетесь обновлять состояние этого экземпляра объекта Car ?
Изменение состояния экземпляра
К счастью, довольно просто обновить состояние объекта. Во-первых, нам нужен метод setter ! Ruby определяет настройки getter и setter как attr_reader и attr_accessor соответственно. Для параметров getter и setter для данного атрибута вы также можете просто использовать attr_accessor .
Чтобы продемонстрировать это, я изменил предыдущий объект Car с этими новыми настройками.
class Car 
    attr_accessor :color 
    attr_reader :make, :model 
 
    def initialize(make, model, color) 
        @make = make 
        @model = model 
        @color = color 
    end 
 
    def turn(direction) 
    end 
 
    def honk 
        puts "beep beep" 
    end 
 
    def brake 
    end 
 end 
Теперь мы можем изменить состояние и прочитать состояние объекта.
irb(main):023:0> c = Car.new('Mazda', 'Mazda3', 'White') 
 => #<Car:0x00007fd3ca13fdd0 @make="Mazda", @model="Mazda3", @color="White", @speed=nil> 
 irb(main):024:0> c.color 
 => "White" 
 irb(main):025:0> c.make 
 => "Mazda" 
 irb(main):026:0> c.model 
 => "Mazda3" 
 irb(main):027:0> c.color = 'Brutal Blue' 
 => "Brutal Blue" 
 irb(main):028:0> c.make = 'Prius' 
 Traceback (most recent call last): 
        2: from /usr/local/bin/irb:11:in `<main>' 
        1: from (irb):28 
 NoMethodError (undefined method `make=' for #<Car:0x00007fd3ca13fdd0>) 
 Did you mean?  make 
Просматривая предыдущий вывод из irb , вы можете видеть, что каждая из переменных экземпляра читаема. Мы можем писать в @color , но в итоге мы NoMethodError исключение NoMethodError когда пытаемся написать @make . Это связано с тем, что @make определялся только с помощью attr_reader , поэтому make= не определен.