【问题标题】:How to solve strange Haxe compiler error?如何解决奇怪的 Haxe 编译器错误?
【发布时间】:2013-09-26 20:04:59
【问题描述】:

我不认为我的语法在这里实际上是坏的。或者是吗?这是我第一次尝试 OpenFL。

Haxe 编译不正确?我是否缺少编译器指令?我在这个函数中实际上有语法错误吗? Flashdevelop 中的语法检查器拒绝

命令如下:

Running process: C:\Program Files (x86)\FlashDevelop\Tools\fdbuild\fdbuild.exe "C:\dev\Haxe\TestOpenFL\OpenFLTest.hxproj" -ipc 2e4ace78-45b9-4868-a2dd-cf2c35265f44 -version "3.0.0" -compiler "C:\HaxeToolkit\haxe" -library "C:\Program Files (x86)\FlashDevelop\Library" -target "flash"

src/Main.hx:32:字符 16-17:意外; 构建因错误而停止 (haxelib.exe)。

function init() 
{
    if (inited) return;
    inited = true;

    //           \/ says this semicolon is unexpected. wtf 
    for (var i = 0; i < 200; i ++)
    {

        var bmd = new BitmapData( 100, 100, true, 0xff0000ff);
        var bmp = new Bitmap( bmd);

        addChild(bmp);

        bitmaps.push( bmp );            
    }

    addEventListener( Event.ENTER_FRAME, onEnterFrame );
}

这是整个脚本。我一生都无法弄清楚为什么它会在那里出错。 如果我只注释掉循环,它编译得很好。

class Main extends Sprite 
{
var inited:Bool;    
var bitmaps:Array<Bitmap>;

/* ENTRY POINT */   
function resize(e) 
{
    if (!inited) init();
    // else (resize or orientation change)
}

function init() 
{

    bitmaps = new Array();

    if (inited) return;
    inited = true;

    for (var i = 0; i < 200 ; i ++)
    {
        // Assets:
        var bmd = new BitmapData( 100, 100, true, 0xff0000ff);
        var bmp = new Bitmap( bmd);

        addChild(bmp);

        bitmaps.push( bmp );            
    }

    addEventListener( Event.ENTER_FRAME, onEnterFrame );
}

private function onEnterFrame(e:Event):Void 
{
}




/* SETUP */

public function new() 
{
    super();
    addEventListener(Event.ADDED_TO_STAGE, added);
}

function added(e) 
{
    removeEventListener(Event.ADDED_TO_STAGE, added);
    stage.addEventListener(Event.RESIZE, resize);
    #if ios
    haxe.Timer.delay(init, 100); // iOS 6
    #else
    init();
    #end
}

public static function main() 
{
    // static entry point
    Lib.current.stage.align = flash.display.StageAlign.TOP_LEFT;
    Lib.current.stage.scaleMode = flash.display.StageScaleMode.NO_SCALE;
    Lib.current.addChild(new Main());
}

}

【问题讨论】:

  • 我不具体了解 Haxe,但您应该尝试在循环外声明 i(这样循环中就没有 var)。我知道一些解析器对此有疑问。
  • 其实看这里:haxe.org/ref/syntax#for
  • 嘿,好的。我的语法对于迭代器来说是完全错误的。附言我尝试将 i 声明在循环之外,这导致了其他错误。

标签: syntax compiler-errors haxe openfl


【解决方案1】:

第一件事:看看Haxe syntax page,它将帮助您解决很多未来的问题。

接下来,Haxe 中的 for 有点棘手,它有点像 foreach,所以你可以这样使用它:

for(myElem in elements){
    // loop here
}

元素实现 Itarable 的地方(如 Array、GenericStack 或 Map)。但是如果你想增加一个变量,你可以使用...操作符创建一个Iterable。所以,以你的代码为例:

for(i in 0...200){
    // loop here
}

在这里,i 将取 0 到 200 之间的所有 int 值(不包括在内)。

【讨论】:

  • 在旁注中,我想既然 ... 和老式循环语法都可以通过 Flashdevelop 语法检查器进行检查,我想知道该设置是否可以在 FD 中更改。猜猜这完全是另一个问题。
【解决方案2】:

完整的菜鸟问题。直接投入而不是阅读文档(这是最好的学习方式,恕我直言)。

您不能在 Haxe 中使用循环。你必须使用迭代器。

for (i in 0...200)
{
         //do stuff
}

【讨论】:

  • 这仍然是一个 for 循环,只是不是“普通”的 c 风格。
  • 但是迭代器不依赖类型来确定 next() 运算符吗? while(setIterator.hasNext()){..} 与将执行迭代而不考虑列表的循环?
  • 嗯,不知道幕后发生了什么,但也许 ... 运算符在说“不要使用迭代器”,而 e4x 语法 for(x in y ) 使用迭代器。
  • 我的意思是,我们通常认为“循环”是某种重复。循环有多种类型,迭代器的使用就是其中之一。 “普通”的 c 风格 for 是另一种类型的循环。在实现方面,Haxe 的 a...b 被键入为 IntIterator,但循环将被编译为普通的 while 循环。但无论如何,这肯定是一个循环。
猜你喜欢
  • 1970-01-01
  • 2016-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多