Follow-up к #4033 / #4134.
В #4134 пользовательские OneScript-классы с аннотацией &Обходимое начали распознаваться как коллекции (supportsForEach=true), но тип элемента при обходе остаётся «любым» (как у Массив). То есть Для Каждого Элемент Из Коллекция Цикл даёт Элемент типа «произвольный», а не конкретный тип.
Главный вопрос: откуда брать тип элемента?
В исходниках OneScript тип элемента коллекции нигде явно не объявлен — движок при обходе отдаёт Произвольный. Нужно решить, какой источник истины использовать. Возможные варианты:
-
@return функции ТекущийЭлемент() итератора. Цепочка: &Обходимое-класс → ПолучитьИтератор() возвращает итератор → итератор помечен &Итератор, у него ТекущийЭлемент() с типизированным @return. Минус: в collectionos ТекущийЭлемент() нетипизирован (Возврат ВнутреннийИтератор.Следующий()), так что для самой библиотеки это всё равно даст any.
-
@return функции ПолучитьИтератор() (если её тип — конкретный класс-итератор с известным типом элемента).
-
Отдельная аннотация/конвенция на классе-коллекции, явно объявляющая тип элемента (например, &ТипЭлемента("Число") или дженерик-параметр). Требует договорённости и доработки на стороне библиотек коллекций.
-
Эвристика по @return методов Получить(Индекс) / Элемент(...) и т.п.
Вопросы к обсуждению
- @sfaqer, как ты видишь источник типа элемента для collectionos и пользовательских коллекций в целом? Готов ли движок/библиотеки нести эту метаинформацию (типизированный
ТекущийЭлемент() / отдельная аннотация / дженерик)?
- Достаточно ли best-effort вывода (типизирован
ТекущийЭлемент() → берём; иначе any), или нужна явная декларация?
Связано
Follow-up к #4033 / #4134.
В #4134 пользовательские OneScript-классы с аннотацией
&Обходимоеначали распознаваться как коллекции (supportsForEach=true), но тип элемента при обходе остаётся «любым» (как уМассив). То естьДля Каждого Элемент Из Коллекция ЦиклдаётЭлементтипа «произвольный», а не конкретный тип.Главный вопрос: откуда брать тип элемента?
В исходниках OneScript тип элемента коллекции нигде явно не объявлен — движок при обходе отдаёт
Произвольный. Нужно решить, какой источник истины использовать. Возможные варианты:@returnфункцииТекущийЭлемент()итератора. Цепочка:&Обходимое-класс →ПолучитьИтератор()возвращает итератор → итератор помечен&Итератор, у негоТекущийЭлемент()с типизированным@return. Минус: в collectionosТекущийЭлемент()нетипизирован (Возврат ВнутреннийИтератор.Следующий()), так что для самой библиотеки это всё равно дастany.@returnфункцииПолучитьИтератор()(если её тип — конкретный класс-итератор с известным типом элемента).Отдельная аннотация/конвенция на классе-коллекции, явно объявляющая тип элемента (например,
&ТипЭлемента("Число")или дженерик-параметр). Требует договорённости и доработки на стороне библиотек коллекций.Эвристика по
@returnметодовПолучить(Индекс)/Элемент(...)и т.п.Вопросы к обсуждению
ТекущийЭлемент()/ отдельная аннотация / дженерик)?ТекущийЭлемент()→ берём; иначеany), или нужна явная декларация?Связано
supportsForEach), без типа элемента