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)
							 |