Flash ActionScript 3 Ошибка? Использование int и отрицательных чисел в коммутаторе/случае
Запуск этого кода
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;
}
дает этот результат:
2 == 0
-2 is unknown
(Скомпилирован в Flash Builder 4.7.0.349722, работающий на Flash 11.5.502.149. Запуск в Windows 7 с пакетом обновления 1 (SP1), Firefox 18.0.2)
Следующие изменения устраняют эту проблему, обеспечивая правильный вывод:
- Изменение значения типа
Number
.
- Удаление операторов отрицательного числа
case
.
- Изменение операторов
case
для использования int
- переменных, а не литералов... если только эти переменные не являются const
, и в этом случае он остается сломаны!
Изменение myValue2 = -1
дает вывод -1 == -3
, который равно равно wtf-ish.
Ясно, что это ошибка, но... что ее вызывает? Есть ли какой-то тонкий нюанс использования int
или отрицательных чисел в case-утверждениях, которые я не понимаю? Мой код как-то не так? Или это просто проблема с байтовым компилятором в Flash Builder?
Ответы
Ответ 1
Я не думаю, что вы найдете конкретный ответ на этот вопрос.
То, что я могу предложить, является подтверждением баггинга компилятора AS3.
Я потратил довольно много времени на то, чтобы разрешить подобные "магические" ошибки и подошел пустой.
Одним из таких примеров является цикл For и While, пропускающий первый или последний элемент в массиве без видимой причины, в то время как цикл Foreach работал просто отлично.
Для меня самая правдоподобная причина для этого - ошибка в управлении памятью.
Это также может быть связано с оборудованием, поскольку частота таких событий происходит на некоторых машинах, над которыми я или мои коллеги работали.
Я думаю, что некоторые "невидимые" условия удовлетворяются, например, порядок выполненных операций (вы могли бы попытаться помещать некоторый фиктивный код между объявлением var и коммутатором или, возможно, назначать пару значений var больше раз, просто чтобы "переиграть память" ), что в сочетании с компромиссом с ошибкой испортили память адресации, и ваш коммутатор думает, что он объединяет два целых числа, в то время как в действительности он получил другое значение из памяти.
Ответ 2
Возможно, вы можете заставить компилятор вручную преобразовать исходное значение в String и сделать ваши случаи в значениях String.
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;
}
Ответ 3
Это просто проблема с байтовым компилятором в Flash Builder.
Ясно, что ваш синтаксис прекрасен; существует буквально сотни известных проблем с компилятором, относящимся к 2005 году, которые все еще открыты или неразрешены.