Область видимости и типы объектов


Область видимости — это способность переменной быть использованной в контексте определенного фрагмента кода. Класс, объект, процедура, метод, код, вложенный в блоки условных операторов и циклов — все это может быть областью видимости.

В Ruby существует 5 типов переменных:
variable — локальная переменная, она доступна только в той области видимости, где была определена, а также во всех вложенных областях видимости.

@variable - переменная объекта (экземпляра класса), имена таких переменных должны начинаться с одного знака @ — это еще одно соглашение в Ruby, которое вы обязаны знать. переменные экземпляра класса доступны только в том объекте, где они определены и вложенных в него областях видимости.

@@variable — переменная класса, имена таких переменных должны начинаться с двух символов @. Их область видимости — класс в котором они определены и все экземпляры данного класса.

$variable — глобальные переменные, их имена должны начинаться с символа $, а область видимости — вся программа.

CONST - константы это не переменные, но предназначение похожее — хранить ссылку на объект. Имена констант должны начинаться с большой буквы. Область видимости константы такая же как и у глобальной переменной, единственное отличие заключается в том, что значение константы следует использовать для «статики». При попытке изменить значение константы, значение будет изменено, однако будет возвращено предупреждение. В большинстве других языков программирования константы не могут переопределяться.

Создание объектов
В Ruby существует предопределенные типы данных, такие как строки, числа, символы и другие, мы рассмотрим их в следующей главе. И существуют абстрактные — то, что мы создавали, класс Cat и Kitten. Отличие в создании базовых (предопределенных) типов и абстрактных заключается в том, что для базовых типов существует специальный упрощенный синтаксис:
5.object_id #=> 11
"string".object_id #=> 82742600
[1,2,3].object_id #=> 82800010

Просто используя тот или иной литерал, мы автоматически создаем соответствующий объект. Работая с абстрактными типами данных, нам необходимо явно определять объект при помощи метода .new класса, примеры:
c = Cat.new(10,5)
k = Kitten.new(1, 2, 'Tom')

c и k являются всего лишь переменными ссылающимися на реальные объекты в памяти компьютера, которые не имеют имен, но имеют уникальные идентификаторы объектов, по которым к ним происходит обращение.

Создавая объект (экземпляр класса) нам необходимо воспользоваться методом .new. Метод .new принимает аргументы для создания класса, которые затем могут быть использованы в методе #initialize и создает новый объект.

Методы классов и методы объектов
Вы наверняка заметили, что в данном учебнике перед именами одних методов я ставлю знак #, а перед именами других я ставлю точку. Это такая договоренность, согласно которой имена методов вне кода начинаются с символа # если метод принадлежит объекту и с . , если метод принадлежит классу. Метод класса отличается от метода объекта тем, что приемником метода класса является класс, а приемником метода экземпляра класса является экземпляр класса (объект). Хочу заметить, что в Ruby даже сами классы являются объектами. Отличие классов от объектов заключается в том, что каждый класс является экземпляром базового класса Class. Любой метод объявленный следующим образом:
def method_name()
end

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

def self.method_name()
end