parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

Ответ

G_Z 07.12.2015 20:51 / 07.12.2015 20:54

GET_DEFAULT должен точно знать какие поля есть, а каких нет.
Он не знает какие есть, он знает откуда брать несуществующие, за которыми к нему обратились.
При этом никто ему самому звать несуществующие поля никто не запрещает.

Он может выдавать значение по умолчанию для поля, которое впоследствии может быть декларировано явно.
Откуда взяться рекурсивному вызову непонятно.
У меня сложный пример из «ORM».
Есть класс, который хранит набор полей объекта ($self._data).
Для доступа к связанным объектам в класс компилируются геттеры свойств.
Имена свойств разных объектов этого класса могут конфликтовать, потому процессить @GET_свойство[] в лоб нельзя, нужно уникальное имя на уровне класса.
Я компилирую набор свойств с уникальными именами (они доступны всем объектам класса), а на уровне объектов храню соответствие «свойство объекта — свойство класса».
Очень похоже на костыль для @auto[filespec] объекта.

Напрямую установить соответствие свойства объекта и свойства класса в виде ссылки или junction нельзя — будет либо выполнение, либо ouside of context.
Потому я храню связи в хеше ($self._fields) и в GET_DEFAULT смотрю к чему идёт обращение — к данным объекта или к динамическим свойствам объекта.
В итоге код получается примерно такой, как в моём первом сообщении:
@GET_DEFAULT[name]
^if(^self._data.contains[$name]){
# 	обращение к полю в _data
	$result[$self._data.$name]
}{
# 	обращение динамическому свойству
	$result[$self.[$self._fields.$name]]
}
И вот тут происходит рекурсивный вызов, который возвращает динамическое свойство, но код геттера этого свойства к полям объекта доступа уже не имеет.