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