Держу пари, ты уже пекла печенье. Если вы еще не видели, вы наверняка видели, как кто-то отмерял и смешивал муку, яйца, сахар и масло. У всех нас есть представление о том, из чего состоит файл cookie, но каждый файл cookie в чем-то уникален. Может быть, секрет рецепта печенья вашего отца заключается в том, что он добавляет в него дополнительную столовую ложку сливочного масла. Может быть, ваша тетя добавляет щепотку мускатного ореха. Может быть, ваш сосед по комнате любит заменять молочный шоколад чипсами из темного шоколада. Все здесь следуют одному и тому же рецепту, но получаются разные продукты.

Именно так работают классы на любом объектно-ориентированном языке (например, Ruby или Python). Класс — это, по сути, рецепт — тот, который может создавать разные версии одного и того же типа снова и снова. Давайте посмотрим на пример:

class Cookie
end

Мы хотим создать класс cookie, чтобы мы могли написать кулинарную книгу, используя Ruby. Cookie нужно писать с заглавной буквы, чтобы Ruby распознавал его как класс. Здорово! Все идет нормально. Мы хотим, чтобы все наши файлы cookie имели некоторую стандартную информацию: тип файла cookie, количество чашек муки, надстройки любого типа и количество файлов cookie, которые делает рецепт. Мы решили, что это важные определяющие факторы файла cookie.

class Cookie
def initialize(type, cups_of_flour, add_ins, number)
  @type = type
  @cups_of_flour = cups_of_flour
  @add_ins = add_ins
  @number = number
 end
end

Здесь мы используем метод инициализации, чтобы сообщить Ruby, с чем должен быть создан каждый файл cookie. Каждый файл cookie должен принимать несколько фрагментов информации, и эта информация должна быть доступна для всего класса, чтобы мы могли использовать эту информацию позже. Это то, что происходит внутри метода инициализации — мы создаем переменные экземпляра из предоставленной нам информации.

Теперь мы хотим иметь возможность что-то делать с этой информацией. Вот тут-то и появляются методы нашего класса.

class Cookie
 def initialize(type, cups_of_flour, add_ins, number)
  @type = type
  @cups_of_flour = cups_of_flour
  @add_ins = add_ins
  @number = number
 end
def type
  @type
 end
end

Это выглядит довольно глупо, но этот метод type позволяет нам получить доступ к @type, когда мы захотим. Теперь давайте сделаем cookie и посмотрим:

class Cookie
 def initialize(type, cups_of_flour, add_ins, number)
  @type = type
  @cups_of_flour = cups_of_flour
  @add_ins = add_ins
  @number = number
 end
def type
  @type
 end
end
cookie1 = Cookie.new(sugar, 1.5, cinnamon, 12)
cookie1.type
    >>sugar

Здесь внизу мы создали новую версию Cookie с некоторыми специфическими атрибутами. Это конкретное печенье представляет собой сахарное печенье, в него входит 1,5 стакана муки, добавляется корица, и получается 12 печений. Когда мы используем метод type для нашего нового файла cookie, он показывает нам тип, который мы ввели ранее. Мы только что испекли новое печенье по нашему рецепту! Далее мы хотим добавить больше методов

class Cookie
 def initialize(type, cups_of_flour, add_ins, number)
 @type = type
 @cups_of_flour = cups_of_flour
 @add_ins = add_ins
 @number = number
 end
def type
  @type
 end
def cups_of_flour
  “#{@cups_of_flour} cups of flour”
 end
def add_ins
  @add_ins
 end
def number
  “#{@number} cookies”
 end
def all_gone
  "The cookies are all gone!
 end
end
cookie1 = Cookie.new(“sugar”, 1.5, “cinnamon”, 12)
puts cookie1.type
    >>"sugar"
puts cookie1.cups_of_flour
    >>"1.5 cups of flour"
puts cookie1.add_ins
    >>"cinnamon"
puts cookie1.number
    >>"12 cookies"
puts cookie1.all_gone
    >>"The cookies are all gone!"

Теперь мы можем получить доступ ко всем уникальным аспектам cookie1!

Используя тот же самый план, мы можем сделать множество различных типов файлов cookie.

cookie2 = Cookie.new(“chocolate chip”, 1.5, “almonds”, 24)
puts cookie2.type
    >>"chocolate chip"
puts cookie2.add_ins
    >>"almonds"
puts cookie2.number
    >>"24 cookies"

Вот и все! Вы создали свой первый класс Ruby. А теперь иди и испеки печенье!