【问题标题】:Is this a bug with AS3 conditional compilation?这是 AS3 条件编译的错误吗?
【发布时间】:2012-04-07 06:15:08
【问题描述】:

在我们的代码中,我有以下内容,现在请忽略//* 位;

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,如果这有影响的话。

【问题讨论】:

  • 您是否将此代码复制粘贴到您的项目中?会不会是里面藏着一些奇怪的人物,不小心惹到你了。
  • 显然人们不知道Flash的conditional compilation or its syntax
  • 我测试了你的例子(或者至少是它附近的东西——我没有 Flash CS4,只有 Flash Builder),并没有得到任何奇怪的行为。我只能建议尝试在尽可能简单的测试用例中重现该行为,以尝试找到导致此问题的奇怪隐藏事物。
  • 我也很困惑为什么上面的方法不起作用,我会尝试用一个简单的例子来复制。似乎@AkashKava 的示例可能是最优雅的解决方案,但我还没有尝试过。

标签: actionscript-3 apache-flex flash-cs4 flashdevelop


【解决方案1】:

我不确定你在用 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

[编辑]
请注意第一个“即”如何将属性显示为未定义。

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

reference

【讨论】:

  • 如果您不知道如何使用编译常量,请不要回答问题。 TARGET::myTarget 将在将 actionscript 编译为 swf 之前在项目级别上定义/取消定义。
  • @zzzzBov 你是对的,但我认为他对 cme​​ts 提出了一个有效的观点。这很可能是问题的答案。
  • @RIAstar,他关于/* cmets 的观点在我发表第一条评论后更新。不幸的是,他也错了:/* 确实开始了多行评论,但//* 没有。这是一个单行注释,后跟一个星号。此外,它被指出仅用作问题的代码标记。
  • @zzzzBov 我已经纠正了。那应该是另一个-1 ;)
【解决方案2】:

这不是错误,编译器将删除任何 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 示例,他们已经在方法声明之外应用了符号,所以当你在成员体之外编写条件编译符号时,成员体被包含/排除,但在 inline 语句的情况下,flex 无法确定什么要排除,所以应该在if内的条件下使用。

在此处查看答案和链接,

Flash/Flex conditional compilation "else"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-29
    • 1970-01-01
    相关资源
    最近更新 更多