Вход

Просмотр полной версии : XMLList + E4X + switch, bug?


$mival
04.07.2009, 19:12
Привет.
В общем не работает следующее выражение внутри switch -> case
var list2:XMLList = xml..*.(attribute('name') == mode);
list2 остается null при том что есть удовлетворяющие выражению тэги в XML.
Все подробно в примере.
Интересно, почему так?

upd: выложу все-таки код для наглядности:

package
{
import flash.display.MovieClip;
public class Test extends MovieClip
{
public function Test()
{
var mode:String = "seven";
var xml:XML =
<root>
<node name = "node one">
<sub_node name = "node two"/>
<sub_node name = "node three"/>
<sub_node name = "node four">
<b_node a="atr_a" name = "node five"/>
</sub_node>
</node>
<node name = "node six">
<sub_node a = "atr_a" name = 'seven'/>
</node>
</root>

var list:XMLList = xml..*.(attribute('name') == mode);
trace(list.toXMLString());

// внутри switch происходят интересные вещи, не срабатывает запрос к XML в варианте code 1 и code 2 ниже
// в code 3 всё работает нормально
// выше до switch такого глюка нет
switch (mode)
{
case "seven":
// code 1
var list2:XMLList = xml..*.(attribute('name') == mode); // output 'null'
//
// code 2
// var list2:XMLList = new XMLList(xml..*.(attribute('name') == mode));
//
// code 3
//var list2:XMLList;
//list2 = xml..*.(attribute('name') == mode);
//
if (list2) trace(list2.toXMLString());
break;
}
}
}
}

ramshteks
04.07.2009, 19:25
я может что не понял, но ты как бы пытаешься логическое выражение вызвать...

$mival
04.07.2009, 19:30
я может что не понял, но ты как бы пытаешься логическое выражение вызвать...

суть в том что в одном месте работает а внутри switch нет

iflamberg
04.07.2009, 19:34
реально похоже на глюк. Если определить list2 за пределами switch, то все работает.


var list2:XMLList;
switch (mode) {
case "seven":
list2 = xml..*.(attribute('name') == mode); // output 'null'
trace(list2.toXMLString());
break;
}

$mival
04.07.2009, 19:45
реально похоже на глюк. Если определить list2 за пределами switch, то все работает.


var list2:XMLList;
switch (mode) {
case "seven":
list2 = xml..*.(attribute('name') == mode); // output 'null'
trace(list2.toXMLString());
break;
}


см. внимательно код, list2 можно определить хоть в switch, но это уже две строки :)

iflamberg
04.07.2009, 19:53
ну, дык, баг обойти можно? можно. Значит, это уже не баг а фича, и её просто надо учитывать =)

2morrowMan
04.07.2009, 20:24
У меня тоже был похожий случай (http://flashrush.com/blog/archives/159).

ramshteks
04.07.2009, 20:59
вообще насколько я помню даже с++ не давал делать объявления внутри свитча, это своеобразная защита видимо от случая если ты начнешь использовать переменную вне свитча, объявленную в той ветке по которой алгоритм не прошел... видимо как то так... здесь наверное так же...

udaaff
04.07.2009, 21:35
http://bugs.adobe.com/jira/browse/ASC-2901
Похоже, взятие блока case в фигурные скобки (что я всегда делаю) решает эту проблему.

$mival
04.07.2009, 21:37
сразу пользуясь случаем хочу спросить, вот так
xml..*.(attribute('name') == mode);
мы берем список тегов, которые совпадают по атрибуту name со строкой mode
а если нам нужно не список тегов получить, а только имен тегов?
вот так:
xml..*.(attribute('name') == mode).name();
не катит.

Добавлено через 3 минуты
http://bugs.adobe.com/jira/browse/ASC-2901
Похоже, взятие блока case в фигурные скобки (что я всегда делаю) решает эту проблему.

можете показать?)

udaaff
04.07.2009, 21:51
switch (mode)
{
case "seven":
{
var list2:XMLList = xml..*.(attribute('name') == mode);
trace(list2.toXMLString());
break;
}
}
Что самое интересно, при тестировании в кадре, все нормально пашет.

$mival
04.07.2009, 21:59
switch (mode)
{
case "seven":
{
var list2:XMLList = xml..*.(attribute('name') == mode);
trace(list2.toXMLString());
break;
}
}
Что самое интересно, при тестировании в кадре, все нормально пашет.

да и ещё наверное лучше определять все переменные и константы метода в самом его начале.
так по-хорошему и делается :quiet: