Первые пять недель моего пребывания в Makers Academy мы писали код на Ruby. Затем, как только я начал чувствовать, что действительно понимаю некоторые вещи, появился проект, в котором нам пришлось использовать JavaScript, и эта глупая идея вылетела из моей головы.

В отличие от Ruby, который представляет собой язык программирования на основе классов, JavaScript представляет собой язык на основе прототипов. Не уверен, что это значит? Добро пожаловать в мой мир на пятой неделе.

Как могли заметить зоркие среди вас, в этом блоге уже есть тема. И нет, дело не только в Матрице — если вы не готовы к целой куче кода и гифок из классики киберпанка конца 90-х, я бы порекомендовал проверить мой первый пост, прежде чем погружаться глубже в кроличью нору.

Нет, на этот раз я собираюсь немного рассказать о главном антагонисте трилогии: агенте Смите. Почему? Потому что я считаю, что Смит, и, в частности, разница в его характере между первым и вторым фильмами «Матрица», на самом деле является довольно хорошим способом понять разницу между компьютерным языком, основанным на классах и прототипах.

Не верите мне? Очень разумно. Но посмотрим, как мы пойдем.

Раб системы

В первом фильме агент Смит является частью Матрицы. Как Морфеус объясняет Нео, в особенно крутом примере научно-фантастического изложения Агенты — это разумные программы, которые могут взять под контроль любого, кто все еще подключен к системе.

Как бы это выглядело, если бы это было написано как программа? Ну, я еще не на том уровне, чтобы кодировать симуляции виртуальной реальности, чтобы поработить человечество совсем, но давайте представим, что Матрица была написана на Ruby. Это может выглядеть примерно так:

class Agent
  def initialize(name, appearance)
    @clothes = "Grey suit"
    @weapon = "Desert Eagle"
    @sunglasses = true
    @name = name
    @appearance = "White dude who looks like " + appearance
  end
end

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

Smith = Agent.new("Smith", "Business Elrond")
=> #<Agent:0x007f91dba3e368
 @clothes = "Grey suit",
 @weapon = "Desert Eagle"
 @sunglasses = true,
 @name = "Smith", 
 @appearance = "White dude who looks like Business Elrond"
 @exploded = false >
Jones = Agent.new("Jones", "Clark Kent if he didn't have Superman as an alter-ego and just worked a boring desk job")
=> #<Agent:0x007f802d96f1e0
 @clothes = "Grey suit",
 @weapon = "Desert Eagle"
 @sunglasses = true,
 @name = "Jones", 
 @appearance = "White dude who looks like Clark Kent if he didn't have Superman as an alter-ego and just worked a boring desk job"
 @exploded = false >

Бум! У нас есть Агенты!

И агент Джонс, и агент Смит — отдельные личности. У них есть уникальный идентификационный номер, который Ruby генерирует автоматически, а также определенные атрибуты, такие как их имя и внешний вид, которые являются специфическими для них и предоставляются Matrix при инициализации.

Важным моментом здесь является то, что хотя Смит и Джонс являются уникальными экземплярами агентов, они являются частью иерархии классов. Они, как и обитатели Матрицы, являются лишь частью более широкой системы — системы, в которой они являются экземплярами класса агентов, который сам является просто экземпляром объекта Class. Ruby — это иерархия различных объектов, каждый из которых наследует свойства объекта над ним. Если вы проследуете по цепочке достаточно далеко, вы достигнете основного корня, которым является объект Object.

Вот почему Ruby является объектно-ориентированным языком программирования, и почему часто говорят, что все, что есть в Ruby, является объектом: потому что, если вы проследите цепочку достаточно далеко, это то, чем все на самом деле является.

Итак, агент Смит является частью нашей иерархии Ruby Matrix. Это означает, что в виртуальной симуляции ему можно дать целый ряд преимуществ перед обычными людьми, например суперсилу и скорость, но они вытекают именно из его привилегированного положения в системе.

Когда Нео понимает, что он Избранный, он действительно понимает то, что Морфеус пытался объяснить ему ранее в фильме: хотя Матрица дает агентам силу, они также скованы ею. Освободившись от необходимости подчиняться тем же правилам реальности, что и агент Смит, Киану Ривз теперь может нанести серьезный удар нашему созданному Руби злодею.

Нео, как и мы, теперь может видеть код, на котором основан Агент Смит. Он также может повторно открыть класс Agent и определить новый метод, который делает следующее:

Class Agent 
  def explode
    @exploded = true
    puts "Agent #{@name} exploded. Ouch"
  end
end
Smith.explode

Неплохо для нескольких строк кода, а?

Итак, к концу первого фильма Нео немного выучил Руби. Потрясающий. Но все становится намного сложнее. А вот и JavaScript.

Часть 2 скоро!

(нажмите кнопку "Подписаться" ниже, если хотите узнать, что будет дальше!)