В Ruby мы присваиваем значения объектам с помощью оператора =
.
Объедините это с неявной типизацией, и мы часто получаем такие ситуации:
myVar= :asymbol
Вышеприведенная строка создает новый объект символа и связывает объект с именем переменной myVar
.
Семантически, как это делается?
Я забил в голову, что оператор =
- это не магический синтаксис, встроенный в интерпретатор, но на самом деле просто синтаксический сахар для метода object.=(value)
.
Учитывая это, я думаю, что когда интерпретатор видит, что мы пытаемся присвоить значение имени переменной undefined, он сначала создает новый объект некоторого специального типа, например undefined
или null
или что-то, а затем передает сообщение :=
этому объекту с полезной нагрузкой, являющейся значением, которое мы пытаемся назначить.
Однако вызов .class
для объекта, не созданного экземпляром, просто генерирует исключение, поскольку Ruby думает, что мы пытаемся вызвать метод (чье имя является именем переменной, которую вы пытаетесь создать) self
> obj.class
> NameError: undefined variable or method 'obj' for main:Object
Итак, насколько я могу судить, я не могу понять это экспериментально.
Боковое примечание:
В случае назначения символа я считаю, что присвоенное значение (AKA - значение, возвращаемое методом созданного объекта object_id
, AKA - значение переменной unsigned long VALUE
на уровне C) - это число, которое представляет собой смещение в таблице где-нибудь (я считаю, что именно так Ruby достигает "немедленного значения" для объектов символа).
В других случаях это значение может быть прямым кодированием самого объекта или значением, которое предназначено для указания указателю в отношении struct
.
Независимо от того, каким образом Ruby представляет объект, и в конечном итоге мы назначаем ссылку или сам объект, это не то, о чем я прошу здесь.
Дополнительный вопрос:
Каким классом является метод =
, унаследованный от? Я не могу найти его в спецификации для Object или BasicObject.