Класс — это первоначальный план или идея создания объекта. Это не настоящий объект, а то, на чем основываются все последующие объекты (экземпляры этого класса). Аналогией может быть формочка для печенья, формочка для печенья задает форму для каждого будущего печенья. Все эти печенья могут иметь разные вкусы и начинки, но все они имеют одинаковую форму.
В моем примере я буду работать над созданием «человека», используя класс 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)
Так родится маленькая армия печенья — ням!
Это мой первый пост в блоге о классах. Любые отзывы или предложения по улучшению этого сообщения в блоге приветствуются и очень ценятся!