Не помню уже было ли что-то подобное в AS. Может и было, просто я не пользовался.
Понадобилось сделать доступ к элементам некого списка, являющегося закрытым свойством класса, через его экземпляр и квадратные скобки. Решение оказалось очень простым...
Например, есть у меня класс PlayerList содержащий функционал списка игроков и хранящий этот самый список в одном из своих полей - в массиве players :Array
Чтобы брать игроков из этого списка, например, по очереди через myPlayerList [n] достаточно просто добавить классу реализацию интерфейса ArrayAccess и метод _resolve с любым необходимым функционалом.
Комментарии
Не работает
Не работает ваш пример, выдает:
at Main$/main()
at MethodInfo-65()
at Boot_ec4e5b()
// ...
var players: Array<Player>;
public function __resolve (n :Int) :Player {
trace("__resolve");
return players[n];
}
public function new() {
}
}
class Main
{
static function main()
{
var p: PlayerList = new PlayerList();
p[0];
}
}
То, что я не создал players — не важно, __resolve вообще не вызывается.
По идее, можно
По идее, можно даже
...
}
и не только с Int - но тогда надо явно писать cast при обращении:
var item = list[cast "mike"];т.е. имеется в
т.е. имеется в виду, что можно без метода
__resolve?если правильно понимаю, это только если сам класс содержит функционал списка, то бишь является итерируемым.
p.s. кстати, я заметил одну небольшую проблему в текущем отображении haXe кода на нашем сайте. Он возникает в случае использования формата Filtered HTML с конструкциями типа
Array<Player>- отфильтровывается тип массива вместе со скобками. Пока её можно обходить просто выбирая формат Full HTML при публикации.Нет, дело не в
Нет, дело не в методе __resolve, дело в том, что можно не только Int'ом параметризовать ArrayAccess, чем угодно можно. Правда потом надо будет использовать cast при индексировании.
Да, понял проблему - и она съела суть моего комментария :)
ок
:) да. ну ничего, главное, что в контексте обсуждения теперь всё понятно
Отправить комментарий