Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Странный глюк при работе с XML. (http://www.flasher.ru/forum/showthread.php?t=182450)

nldr 23.07.2012 18:10

Странный глюк при работе с XML.
 
Кто нибудь знает в чем может быть проблема?

Вот эта функция не работает.
Код AS3:

public function setAnimations(setName:String):void
{
trace(Game.xmlData.units.unit.(@name == setName));
}


А вот так работает:
Код AS3:

public function setAnimations(setName:String):void
{
var str:String = setName;
trace(Game.xmlData.units.unit.(@name == str));
}

Добавлено через 2 часа 40 минут
Разобрался.
setName, которое я опрометчиво использовал в качестве имени параметра, видимо используется где-то еще.

Очень жаль что Flash при компиляции даже в strict-mode о таких вещах не предупреждает.

dimarik 23.07.2012 22:52

Похоже на баг компилятора. Начался с примерно 4.0 Flash Builder SDK. У меня споткнулось на имени параметра как "name".

Код AS3:

...(@name === name)


wvxvw 24.07.2012 15:29

Тут тяжело предупредить, нужно понимать как работает оператор "фильтр". Т.е. xml.(expression) - вот это.

Работает он очень похоже на with, и поэтому возможны похожие казусы, но компилятору трудно понять, что это не то, что хотелось. Т.е. что происходит внутри фильтра:
в цепочку областей видимости добавляется текущий узел (который мы сейчас просматриваем), а все связывания объявленные внутри фильтра ищутся в этой цепочке. Таким образом, если связывание не находится у текущего узла, то его будут искать дальше во всех доступных звеньях цепочки (все импорты, this, super и т.д.).
Вообще, поведение этого оператора на столько не предсказуемо и может измениться динамически в уже скомпилированой программе, что я бы поостерегся его использовать. Или, по крайней мере использовать его исключительно со связываниями в которых однозначно указан объект которому они принадлежат, например:
Код AS3:

xml.(valueOf().@attribute)

- нормально, т.как valueOf() однозначно существует у текущего узла.
Код AS3:

xml.(this.field)

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

dimarik 25.07.2012 00:47

wvxvw, как объяснить появление бага сменой SDK на более высокую версию. В 3.2 работало нормально.

wvxvw 25.07.2012 02:54

А что значит "споткнулся"?
Были баги связаные с e4x. Возможно что-то исправили.
Код
Код AS3:

.(@name === name)

почти наверняка ошибка @name - XMLList и получить тот же XMLList в том же контекте но по-другому - можно, конечно, если специально, но практический смысл этого кода вызывает подозрения. Если бы там было два равно, тогда можно было бы подумать, что делается неявное приведение типов, а так - почти наверняка такой код будет всегда false.


Часовой пояс GMT +4, время: 15:11.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.