que - Flash Actionscript 3 Bug? Usando números int y negativos en un interruptor/caso
flash as3 (3)
Corriendo este codigo
var myValue1:int = 2;
switch (myValue1)
{
case -3: trace(myValue1 + " == -3"); break;
case -2: trace(myValue1 + " == -2"); break;
case -1: trace(myValue1 + " == -1"); break;
case 0: trace(myValue1 + " == 0"); break;
case 1: trace(myValue1 + " == 1"); break;
case 2: trace(myValue1 + " == 2"); break;
case 3: trace(myValue1 + " == 3"); break;
default: trace(myValue1 + " is unknown"); break;
}
var myValue2:int = -2;
switch (myValue2)
{
case -3: trace(myValue2 + " == -3"); break;
case -2: trace(myValue2 + " == -2"); break;
case -1: trace(myValue2 + " == -1"); break;
case 0: trace(myValue2 + " == 0"); break;
case 1: trace(myValue2 + " == 1"); break;
case 2: trace(myValue2 + " == 2"); break;
case 3: trace(myValue2 + " == 3"); break;
default: trace(myValue2 + " is unknown"); break;
}
da esta salida:
2 == 0 -2 is unknown
(Compilado en Flash Builder 4.7.0.349722, ejecutándose en Flash 11.5.502.149. Ejecutándose en Windows 7 SP1, Firefox 18.0.2)
Los siguientes cambios corrigen el problema anterior, dando el resultado correcto:
- Cambiando el tipo de valor a
Number
. - Eliminando las declaraciones de
case
número negativo. - Cambiar las declaraciones de
case
para usar variablesint
lugar de literales ... a menos que esas variables también seanconst
, ¡en cuyo caso se queda roto!
Cambiar myValue2 = -1
da la salida -1 == -3
, que es igualmente wtf-ish.
Claramente esto es un error, pero ... ¿qué lo causa? ¿Hay algún matiz sutil de usar números int
o negativos en declaraciones de casos que no entiendo? ¿Está mi código de alguna manera equivocado? ¿O es esto simplemente un problema con el compilador de bytecode en Flash Builder?
Esto es simplemente un problema con el compilador de bytecode en Flash Builder.
Claramente, tu sintaxis está bien; Hay literalmente cientos de problemas conocidos con el compilador que se remonta a 2005 que aún están abiertos o sin resolver.
No creo que encuentre una respuesta concreta a esta pregunta. Lo que puedo ofrecer es una confirmación de la falla del compilador de AS3. Pasé bastante tiempo tratando de resolver errores ''mágicos'' similares y salí vacío. Uno de estos ejemplos es un bucle For y While que omite el primer o último elemento de un Array sin motivo aparente, mientras que un bucle Foreach funcionó bien.
Para mí, la razón más plausible de esto es un error en la administración de la memoria. También podría estar relacionado con el hardware, ya que la frecuencia con la que ocurrieron tales cosas fue mayor en algunas máquinas en las que trabajamos o mis colegas. Lo que creo es que se cumplen algunas condiciones "invisibles", por ejemplo, el orden de las operaciones realizadas (podría intentar colocar un código ficticio entre la declaración var y el interruptor o tal vez asignar el valor var un par de veces más, solo para "refrescar la memoria" ) que combinado con el compilador propenso a errores estropea el direccionamiento de la memoria y su conmutador piensa que está compilando dos enteros mientras que en realidad obtuvo un valor diferente de la memoria.
Probablemente pueda forzar la mano del compilador convirtiendo el valor original en una cadena y convirtiendo sus casos en valores de cadena.
switch( String(value) )
{
case "-3": /*do something*/; break;
case "-2": /*do something*/; break;
case "-1": /*do something*/; break;
case "0": /*do something*/; break;
case "1": /*do something*/; break;
case "2": /*do something*/; break;
case "3": /*do something*/; break;
default: break;
}