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