Это ошибка с условной компиляцией AS3? - PullRequest
3 голосов
/ 22 марта 2012

В нашем коде у меня есть следующее, на данный момент, пожалуйста, игнорируйте //* битов;

if (data["someKey"] != null)//*
{
    CONSOLE_OUT.info("Print some stuff.");
    TARGET::myTarget
    {
        var someString:String = data["someKey"] as String;//*
        someController.setSoemthing(someString.indexOf("soemthing") > -1 ? true : false);//*
    }
}

Я установил в своем FlashCS4 константу компилятора TARGET::myTarget, установленную на false, что означает, что код внутри константы компилятора не должен компилироваться. В точке выполнения data["someKey"] оценивается как null, что означает, что оператор if НЕ должен выполняться.

Когда я отлаживаю следующий код, выполняются строки с //*, что является странным поведением. Он пропускает начальную строку после оператора if и сразу переходит к выполнению кода, который не должен был быть скомпилирован, имея в виду, что он все равно не должен вводить оператор if. Это почти так, как будто присутствие константы компилятора приводит к тому, что оператор if выглядит как одна строка, а затем все еще выполняет код в неправильной области видимости.

Однако, если я добавлю оператор else в конце, код выполнится нормально;

if (data["someKey"] != null)//*
{
    CONSOLE_OUT.info("Print some stuff.");
    TARGET::myTarget
    {
        var someString:String = data["someKey"] as String;
        someController.setSoemthing(someString.indexOf("soemthing") > -1 ? true : false);
    }
}
else
{
    CONSOLE_OUT.info("Print some other stuff.");
}

Следует также отметить, что в случае, когда data["someKey"] оценивает что-то отличное от NULL, вышеприведенная версия правильно пропустит (или не скомпилирует) код в константе.

Я просто хочу выяснить, является ли это ошибкой, или я не использую правильный синтаксис для константы компилятора. Если вам нужна дополнительная информация, пожалуйста, дайте мне знать. Я дважды проверил константы моего компилятора, я использую Flash CS4 для компиляции и нацеливаюсь на Flash Player 10, если это имеет значение.

Ответы [ 2 ]

2 голосов
/ 22 марта 2012

Это не ошибка, компилятор удалит любой оператор if (false), поэтому ваша условная константа должна быть включена в оценку состояния.

if (data["someKey"] != null)//*
{
    CONSOLE_OUT.info("Print some stuff.");
    if(TARGET::myTarget) // it should be conditional statement
    {
        var someString:String = data["someKey"] as String;//*
        someController.setSoemthing(someString.indexOf("soemthing") > -1 ? true : false);//*
    }
}

Если вы посмотрите на пример flex, они применили символ вне объявления метода, поэтому, когда вы пишете символ условной компиляции вне тела члена, тело члена включается / исключается, но в случае встроенного оператора, flex не может определить, что чтобы исключить, поэтому он должен быть использован в условии, если.

Смотрите ответы и ссылки здесь,

Условная компиляция Flash / Flex "else"

0 голосов
/ 22 марта 2012

Я не уверен, что вы делаете со статическим классом TARGET.
Я никогда не видел ничего подобного, и, не зная, что такое TARGET, я не знал бы, как это исправить.
В любом случае в вашем операторе if вы проверяете, имеет ли значение someKey, однако, если someKey не был определен, он не будет нулевым, а будет undefined.
С учетом вышесказанного вам необходимо проверить его, и правильный способ проверки будет выглядеть так.

if( data.hasOwnProperty("someKey"){
    CONSOLE_OUT.info("Print some stuff.");
    TARGET::myTarget <<<<<<< WTH is this????????
    {
        var someString:String = data["someKey"] as String;
        someController.setSoemthing(someString.indexOf("soemthing") > -1 ? true : false);
    } }

Также обратите внимание, что символы "/ *" обозначают начало блока комментариев, и весь код после этого будет закомментирован.
Например

/* this would be commented
this would be commented
*/
this line would not be commented

[EDIT]
Обратите внимание, как первый «i.e» показывает свойство как неопределенное.

trace(null == undefined); //Outputs true
trace(null === undefined); //Outputs false

var i:Object;
trace(i); //Outputs null
i = {};
trace(i); //Outputs [object Object]

var i:Object = {a:"b", c:"d"};
trace(i.e); //Outputs undefined
i.e = "f";
trace(i.e); //Outputs f

ссылка

...