Рубин, когда собственные классы появляются
Существуют ли собственные классы до определения одноэлементного метода в объекте или классе. т.е. всегда ли они существуют или появляются, когда определен одноэлементный метод или метод класса?
2 ответа
Каждый объект всегда имеет одноэлементный класс. Период. Нет, если, нет но нет исключений.
В зависимости от того, насколько умным является компилятор или интерпретатор, он может выполнять или не выполнять некоторые оптимизации производительности. Но, как и во всех оптимизациях производительности, им не разрешено изменять результат программы, поэтому, даже если эти оптимизации производительности действительно приводят к определенным состояниям, в которых конкретный одноэлементный класс на самом деле не существует, программа все равно должна вести себя так, как если бы она существовала, так что вы все равно не сможете сказать. В конце концов, это в значительной степени определение "оптимизации производительности".
Некоторые реализации Ruby могут выполнять некоторые оптимизации, другие могут выполнять другие оптимизации, некоторые могут даже вообще не выполнять никаких оптимизаций. Вы не можете судить по результату вашей программы, и вам должно быть все равно, вам должно быть все равно.
Например, YARV выполняет следующие оптимизации:
Поскольку почти ни у одного объекта нет одноэлементных методов, создание одноэлементного класса для каждого объекта было бы пустой тратой памяти, поэтому одноэлементные классы создаются лениво: когда вы создаете одноэлементный метод (
def foo.bar
или жеObject#define_singleton_method
), когда вы открываете синглтон-класс (class << foo
) и когда вы запрашиваете одноэлементный класс объекта (Object#singleton_class
).Поскольку почти в каждом классе есть какой-то метод класса, накладные расходы на ленивое создание одноэлементного класса не имеют смысла, поэтому для классов одноэлементный класс всегда создается с нетерпением.
Но это частная внутренняя деталь реализации YARV. JRuby может сделать это по-другому. IronRuby может сделать это по-другому. MacRuby может сделать это по-другому. MRuby может сделать это по-другому. Топаз может делать это по-другому. Рубинус может сделать это по-другому. MagLev может сделать это по-другому. Даже следующий патч-уровень YARV может сделать это по-другому.
Если вы посмотрите на синглтон-класс, он там. Если вы не смотрите на это, не имеет значения, есть ли оно там. Итак, семантически, это всегда там.
Для таких объектов, как класс, при создании нового класса также создается его собственный класс и их объекта при создании.
пример:- создание класса
class User; end
или же
User = Class.new
его собственный класс также создается в то же время,
и там для каждого объекта класса User создается отдельный собственный класс