ArrayAccess

Не помню уже было ли что-то подобное в AS. Может и было, просто я не пользовался.
Понадобилось сделать доступ к элементам некого списка, являющегося закрытым свойством класса, через его экземпляр и квадратные скобки. Решение оказалось очень простым...

Например, есть у меня класс PlayerList содержащий функционал списка игроков и хранящий этот самый список в одном из своих полей - в массиве players :Array.
Чтобы брать игроков из этого списка, например, по очереди через myPlayerList [n] достаточно просто добавить классу реализацию интерфейса ArrayAccess и метод _resolve с любым необходимым функционалом.

class PlayerList implements ArrayAccess<Player> {
  // ...
  public function __resolve (n :Int) :Player {
    return players[n];
  }
}

Комментарии

Не работает

Не работает ваш пример, выдает:

ReferenceError: Error #1069: Property 0 not found on PlayerList and there is no default value.
        at Main$/main()
        at MethodInfo-65()
        at Boot_ec4e5b()

class PlayerList implements ArrayAccess<Player> {
  // ...
  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 вообще не вызывается.

По идее, можно

По идее, можно даже

class PlayerList implements ArrayAccess<String> {
...
}

и не только с Int - но тогда надо явно писать cast при обращении:
var item = list[cast "mike"];

т.е. имеется в

т.е. имеется в виду, что можно без метода __resolve ?
если правильно понимаю, это только если сам класс содержит функционал списка, то бишь является итерируемым.

p.s. кстати, я заметил одну небольшую проблему в текущем отображении haXe кода на нашем сайте. Он возникает в случае использования формата Filtered HTML с конструкциями типа Array<Player> - отфильтровывается тип массива вместе со скобками. Пока её можно обходить просто выбирая формат Full HTML при публикации.

Нет, дело не в

Нет, дело не в методе __resolve, дело в том, что можно не только Int'ом параметризовать ArrayAccess, чем угодно можно. Правда потом надо будет использовать cast при индексировании.

Да, понял проблему - и она съела суть моего комментария :)

ок

:) да. ну ничего, главное, что в контексте обсуждения теперь всё понятно

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <blockcode> <dd>
  • Строки и параграфы переносятся автоматически.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • You can enable syntax highlighting of source code with the following tags: <code>, <blockcode>.

Подробнее о форматировании

CAPTCHA
Этот вопрос помогает предотвратить автоматический спам
Image CAPTCHA
Enter the characters shown in the image without spaces, also respect upper and lower case.
To prevent automated spam submissions leave this field empty.