Данные объектов хранятся в переменных экземпляра объекта: @my_
variable. Называются переменные только с маленьких букв. Принятой практикой наименования переменных является “undescore”-стиль: @my_instance_variable. Так же, синтаксически допускается обращение к переменным класса объекта:
@class_variable.

Все переменные экземпляра и класса являются закрытыми и извне к ним доступ невозможен синтаксически.

Классы

Как было сказано, класс каждого объекта также является объектом. Более того: классы имеют тип Class. У него есть свои переменные (можно говорить о статических переменных класса) и свои методы:


class Guitar
 @@base_price = 500
 def self.price
    @@base_price * daily_coefficient
 end
end

Такие паттерны, как фабрика или синглтон реализуются достаточно просто, например:


class DBConnection
 def self.create(params)
   @@dbconnection ||= DBConnection.new_with_params(params)
 end

def self.new_with_params(params) dbconn = DBConnection.new dbconn.set_params(params) dbconn end

end

Создание новых объектов.

Обычно создание новых объектов происходит как MyClassName.new, т.е. вызывается метод класса new. Он жестко зашит внутри руби и делает он следующие вещи:

# выделяет память вот объект # инициализирует объект.

Эти два действия разнесены и первое можно даже из руби перекрыть, что бы создать какой-нибудь смартовый менеджер памяти для конкретного типа.

Произвольный метод на объекте вызвать, зная его по имени можно, а произвольный объект создать? Можно.
При обращении MyClassName.new производится поиск по текущей области видимости в поисках константы MyClassName. Если константа не найдена, вызывается метод const_missing. Например, Rails именно так лезет за классами модели, контроллеров и т.д и т.п.

Sidebar