[转]和大家讨论一个小而容易被忽略的问题?

大家看下面的代码,
去掉case里的注释和不去注释运行的结果完全不一样,不行大家可以看看。
大家可以在这里讨论一下问题的本质,我觉得应该是作用域的问题。
  1. package{
  2. import flash.display.Sprite;
  3. import flash.events.IOErrorEvent;
  4. import flash.net.URLLoader;
  5. import flash.net.URLRequest;

  6. public class LuaDemo extends Sprite{        
  7.         var _name:String="eko";
  8.         var eko:XML=<setting><version>1.0.0</version><folder name="data"/><folder name="diy"/></setting>;
  9.         function LuaDemo(){        
  10.            test(eko)
  11.         }
  12.         function test(eko):void
  13.         {
  14.                 switch(_name)
  15.                 {
  16.                         case "eko":
  17.                         //{
  18.                                 var p=eko.folder.(@name=="data");//如果把这里改成 var p="test",也没有问题,只有这样问题才会发生
  19.                                 trace(p.toXMLString())
  20.                                 break;
  21.                         //}
  22.                 }
  23.         
  24.         }
  25. }
  26. }
 
 
 
 
 
 
 
 
我将代码重新整理后,发现还有有问题. 我进行了一些测试. 发现问题是在swith中不能用E4X的find表达式.

然后我就在adobe forums报了一个bug: https://bugs.adobe.com/jira/browse/ASC-4186.

类似的bug以前有人报过, 不过adobe开发人员都将其closed了, 所以这个应该是一个regression bug.
大家可以在自己的环境下面测试一下这个bug.
 
 
 
 
最精简的代码如下:
  1. package{
  2. import flash.display.Sprite;

  3. public class SwitchE4x extends Sprite {
  4.     private var someXML:XML =
  5.         <setting>
  6.                 <folder name1="data"/>
  7.                 <folder name1="diy"/>
  8.         </setting>;

  9.         function SwitchE4x() {
  10.             switch(true)
  11.                 {
  12.                         case true: 
  13.                         //{
  14.                                 var k1:*= someXML.folder.@name1;
  15.                                 trace(k1.toString());
  16.                                 
  17.                                 var m1:* = k1[0];
  18.                                 trace(m1.toString());
  19.                                 
  20.                                 var k:*= someXML.folder;
  21.                                 trace(k.toString());
  22.                                 
  23.                                 //Here, we can not use E4x "find" syntax
  24.                                 //but after uncommenting the case block '{' and '}', it will be OK
  25.                                 //otherwise it will throw m is undefined
  26.                                 var m:* = k.(@name1 == 'data');
  27.                                 m.toString();
  28.                         //}
  29.                 }
  30.         }
  31.     }
  32. }
复制代码

你可能感兴趣的:(.net,xml,Flash,Adobe)