ошибка в словаре flex? - PullRequest
       2

ошибка в словаре flex?

1 голос
/ 19 января 2012

Я тестировал реализацию HashMap в AS3 .

Я пробовал следующий код:

 var map:IMap = new HashMap();
 map.put("a", "value A");
 map.put("b", "value B");
 map.put("c", "value C");
 map.put("x", "value X");
 map.put("y", "value Y");
 map.put("z", "value Z");

Затем я вызвал метод clear ():

map.clear();

Размер хеш-карты не стал 0, но был равен 1. Проблема в том, что когда ключ имеет значение "y", он не удаляется Соответствующий код выглядит следующим образом:

protected var map:Dictionary = null;

public function HashMap(useWeakReferences:Boolean = true)
{
    map = new Dictionary( useWeakReferences );
}

public function put(key:*, value:*) : void
{
    map[key] = value;
}

public function remove(key:*) : void
{
    map[ key ] = undefined;
    delete map[ key ];
}

public function clear() : void
{
    for ( var key:* in map )
    {
        remove( key );
    }
}

Если я снова вызову функцию clear (), оставшаяся клавиша будет удалена:

if (size() != 0)
{
    clear();
}

Кто-нибудь знает, по какой причине клавиша y не удаляется?

1 Ответ

3 голосов
/ 19 января 2012

У меня не было времени взглянуть на реализацию Dictionary в тамарине (виртуальная машина для флэш-памяти), но кажется, что Словарь перефразируется, когда значение отображается на карте линией map[ key ] = undefined; в функции remove.

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

Что вы можете сделать, это удалить map[key] = undefined; из функции remove, и она должна работать. Странно то, что удаление не привело к подобной ошибке ...

Чтобы показать, что произошла перефразировка, посмотрите живой пример: http://wonderfl.net/c/2PZT

Вы увидите, что ключ повторяется дважды, когда вы присваиваете значение словарю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...