Ответ
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]]
}
И вот тут происходит рекурсивный вызов, который возвращает динамическое свойство, но код геттера этого свойства к полям объекта доступа уже не имеет.
- @GET_…[] из @GET_DEFAULT[…] — ошибка?, G_Z [M] 07.12.2015 15:37
- Ответ, MoKo 07.12.2015 20:23
- Ответ, G_Z [M] 07.12.2015 20:31 / 07.12.2015 20:32
- Ответ, MoKo 07.12.2015 20:51
- Ответ, G_Z [M] 07.12.2015 21:06
- Ответ, MoKo 07.12.2015 21:21
- Есть мнение..., Sumo [M] 07.12.2015 20:33
- Ответ, G_Z [M] 07.12.2015 20:51 / 07.12.2015 20:54
- Ответ, Sumo [M] 07.12.2015 21:00
- Ответ, G_Z [M] 07.12.2015 21:04