# coding: utf-8

4.4 Ruby классы

Мы говорили, что все в Ruby является объектами, и в этом разделе мы, наконец, определим некоторые собственные. Ruby, как и многие другие объектно-ориентированных языки, использует классы чтобы организовать методы; эти классы, затем экземплируются для создания объектов. Если вы новичок в объектно-ориентированном программировании, это может звучать как бред, так что давайте посмотрим на некоторые конкретные примеры.

4.4.1 Конструкторы

Мы видели много примеров использования классов для создания экземпляра объекта, но нам еще предстоит сделать это в явном виде. Например, мы экземплировали строку с помощью двойных кавычек, которые являются буквальным конструктором для строк:

  >> s = "foobar"   # Буквальный конструктор для строк, использующий двойные кавычки
  => "foobar"
  >> s.class
  => String

Мы видим здесь, что строки реагируют на метод class, и просто возвращают класс к которому они принадлежат.

Вместо использования буквального конструктора, можно использовать аналогичный именованный конструктор, что подразумевает вызов new метода по имени класса:15

  >> s = String.new("foobar")   # именованный конструктор для строки
  => "foobar"
  >> s.class
  => String
  >> s == "foobar"
  => true

Это эквивалентно буквальному конструктору, но это более четко говорит о том, что мы делаем.

Массивы работают так же, как строки:

  >> a = Array.new([1, 3, 2])
  => [1, 3, 2]

Хэши работают по другому. Если конструктор массива Array.new принимает начальное значение для массива, Hash.new принимает значение по умолчанию для хэша, которое является значением хэша с несуществующим ключом:

  >> h = Hash.new
  => {}
  >> h[:foo]            # попытка доступа к значению несуществующего ключа :foo.
  => nil
  >> h = Hash.new(0)    # Arrange for nonexistent keys to return 0 instead of nil.
  => {}
  >> h[:foo]
  => 0
# coding: utf-8