Класс — это первоначальный план или идея создания объекта. Это не настоящий объект, а то, на чем основываются все последующие объекты (экземпляры этого класса). Аналогией может быть формочка для печенья, формочка для печенья задает форму для каждого будущего печенья. Все эти печенья могут иметь разные вкусы и начинки, но все они имеют одинаковую форму.

В моем примере я буду работать над созданием «человека», используя класс Human. Сначала я настрою голые кости (без каламбура) класса. Имена классов всегда состоят из заглавных букв, начинаются со строчной буквы class и заканчиваются строчной буквой end. Например:

class Human
end

У нас есть первоначальная настройка для этого класса Human, но чтобы он появился, нам нужно создать экземпляр этого класса. Каждый экземпляр этого класса уникален. Чтобы сделать эту концепцию более очевидной, я создам новый экземпляр человеческого класса и сохраню его в переменной с именем katerina.

katerina = Human.new

Итак, теперь у нас есть объект katerina, который является экземпляром класса Human.

Мы могли бы создать еще один экземпляр этого класса, но оба были бы похожи, потому что в данный момент у нашего класса нет «данных».

Чтобы сделать наш объект Human более уникальным, нам нужно определить метод initialize. Этот метод является первым в классе и важен, потому что он устанавливает основные данные, которые получит каждый новый экземпляр класса. @name @age @height и @weight — все это переменные экземпляра, они принадлежат каждому новому экземпляру класса.

Если вам интересно, почему все переменные, кроме @age, кажутся установленными сами по себе, это потому, что мы делаем их гибкими. Отсутствие жесткого кодирования значений для них означает, что когда мы создаем метод, мы можем использовать имя аргумента, рост или вес, а затем передавать любые данные, которые мы хотим для него. Я сделаю пример этого ниже.

def initialize(name, height, weight)
  @name = name
  @age = 0
  @height = height
  @weight = weight
end

Теперь, если мы создадим новый экземпляр класса человека с именем джимбоб

jimbob = Human.new

тогда jimbob и любые другие экземпляры, включая katerina, будут иметь все переменные экземпляра, такие как имя, возраст, рост и вес, включенные в метод инициализации. Однако по мере того, как jimbob и katerina растут, мы хотим, чтобы у них был шанс, и для этого нам нужно работать с их переменными экземпляра. Мы можем сделать это, создав методы в нашем классе, чтобы получить доступ к переменным.

Например, если мы хотим, чтобы katerina стала старше, нам нужно создать для этого метод. Этот метод специально предназначен для любых экземпляров класса, поэтому он является методом экземпляра. Внутри нашего класса Human мы помещаем следующее:

  def gain_a_year
    @age += 1
  end

Однако, если мы снова вызовем katerina в нашей командной строке, ее возраст по-прежнему равен 0.

Чтобы она стала старше, мы должны вызвать метод для любого экземпляра класса, который мы хотим использовать.

katerina.gain_a_year

Каждый раз, когда мы вызываем метод .gain_a_year для katerina или jimbob, они становятся на один год старше. То же самое мы можем сделать с ростом и весом.

Прежде чем я говорил о странной структуре установки переменной экземпляра в то, что кажется само собой. Если бы мы хотели дать нашему экземпляру jimbob имя jimbob, то внутри нашего класса нам нужно было бы сделать следующее:

def name_instance(name)
  @name = name
end

Теперь, если мы вызовем метод экземпляра name_instance(name), то сможем передать любое имя, какое захотим:

jimbob.name_instance("Spongebob")

**Оповещение об изящном трюке**

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

def initialize(name, age=0, height, weight)
  @name = name
  @age = age
  @height = height
  @weight = weight
end

*Полезный совет*

Вы также можете передать несколько значений одновременно, например:

cookie_monster = Human.new("Cookie Monster", 4, 10)
or if you want this new instance's age to be set to something other than zero
cookie_monster = Human.new("Cookie Monster", 4, 10, 90)

Так родится маленькая армия печенья — ням!

Это мой первый пост в блоге о классах. Любые отзывы или предложения по улучшению этого сообщения в блоге приветствуются и очень ценятся!