109 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			109 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
|   | --- | |||
|  | title: Classes and Objects | |||
|  | localeTitle: Классы и объекты | |||
|  | --- | |||
|  | ## Классы и объекты
 | |||
|  | 
 | |||
|  | ### Объекты в Ruby
 | |||
|  | 
 | |||
|  | Давайте быстро перейдем к объектам Ruby. В реальном мире объекты могут быть любыми, включая автомобиль, компьютер или даже человека. Каждый из этих объектов имеет состояние и поведение. | |||
|  | 
 | |||
|  | Учитывая автомобиль, его состояние можно охарактеризовать как его модель, рисунок и цвет. Поведение автомобиля может быть поворотным, гудение или торможение. | |||
|  | 
 | |||
|  | Объект в Ruby имеет очень схожие характеристики. Объекты Ruby также имеют состояние и поведение. В Ruby Objects состояние хранится в переменных экземпляра, и поведение сохраняется в функциях. | |||
|  | 
 | |||
|  | ### Классы в Ruby
 | |||
|  | 
 | |||
|  | Класс - это в основном шаблон программы. Этот шаблон определяет начальные `properties` с использованием `instance variables` . Опять же, есть также и `behaviors` определяемое в виде функций. | |||
|  | 
 | |||
|  | Новый экземпляр класса создается с использованием метода `initialize` класса. | |||
|  | 
 | |||
|  | Возьмем, к примеру, следующий пример кода класса: | |||
|  | 
 | |||
|  | ```Ruby | |||
|  | 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` . | |||
|  | 
 | |||
|  | ```Ruby | |||
|  | mazda3 = Car.new('Mazda', 'Mazda3', 'White')  | |||
|  | ``` | |||
|  | 
 | |||
|  | Это здорово, но иногда вам может понадобиться изменить некоторые из этих атрибутов! Большинство этих атрибутов в этом примере будут статическими. Все же, представьте, что вы решили получить новую краску. Как вы собираетесь обновлять состояние этого экземпляра объекта `Car` ? | |||
|  | 
 | |||
|  | ### Изменение состояния экземпляра
 | |||
|  | 
 | |||
|  | К счастью, довольно просто обновить состояние объекта. Во-первых, нам нужен метод `setter` ! Ruby определяет настройки **getter** и **setter** как `attr_reader` и `attr_accessor` соответственно. Для параметров getter и setter для данного атрибута вы также можете просто использовать `attr_accessor` . | |||
|  | 
 | |||
|  | Чтобы продемонстрировать это, я изменил предыдущий объект Car с этими новыми настройками. | |||
|  | 
 | |||
|  | ```Ruby | |||
|  | 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  | |||
|  | ``` | |||
|  | 
 | |||
|  | Теперь мы можем изменить состояние и прочитать состояние объекта. | |||
|  | 
 | |||
|  | ```Ruby | |||
|  | 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=` не определен. | |||
|  | 
 | |||
|  | ### Ресурсы
 | |||
|  | 
 | |||
|  | *   [Программирование / Синтаксис / Классы Ruby](https://en.wikibooks.org/wiki/Ruby_Programming/Syntax/Classes) |