Данные объектов хранятся в переменных экземпляра объекта: @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 именно так лезет за классами модели, контроллеров и т.д и т.п.