2012-02-02 7 views
1

このループをcoffeescriptに変換するにはどうすればよいですか?操作のあるcoffeescriptのループ

for (var j = world.m_jointList; j; j = j.m_next) { 
     drawJoint(j, context); 
} 
+0

私はこのJavaScriptのループをとにかく理解していません。誰かがcoffeescriptの部分に答える際に説明できますか? –

答えて

2
while j = (unless j? then first else j.next) 
    do stuff 

しかし、一般的に、例えば、ちょうど別のステートメントとして初期化コードでforループを書くことの何が問題になっていj=first; while j then ...; j=j.next

編集:おそらく または、:元に何が起こって

while j = j?.next ? first 
    do stuff 
+0

これは受け入れられる回答である必要があります!私はBox2D [Joint List](http://kyucon.com/doc/box2d/Box2D/Dynamics/b2World)に使用しています。html#GetJointList()) – Jankeesvw

1

Javascriptがcompound for loopsを持っています。かっこ内の宣言には、for(x; y; z){...}という3つの式があります。ループの前に一度

  • x実行
  • yは、各反復の前にテストされ、条件です。それが偽ならループは一度、このコードではすべての反復

  • zの実行を停止します、あなたは、リンクリストの最初の項目であるj = world.m_jointListを設定します。 forループの中間部分は、thruthinessj;であるかどうかをチェックし、各繰り返し後にjj.m_nextに設定されます。これはチェーン内の次のオブジェクトへのポインタです。 jがfalse(おそらくundefined)と評価されたときに終了します。

    worldはこのようになり、それを可視化する:実際には

    world = { 
        m_jointList: { 
         value: 'head', 
         m_next: world.foo1 
        }, 
        foo1: { 
         value: 'foo', 
         m_next: world.foo2 
        }, 
        foo2: { 
         value: 'foo', 
         m_next: world.tail 
        }, 
        tail: { 
         value: 'foo' 
        } 
    } 
    

    をリスト内の項目は、おそらくworldのプロパティとして存在していませんが、これは同じように動作します。最後のオブジェクトでm_nextが未定義であることに注意してください。チェーンの終わりを示す末尾のプレースホルダ値が使用されることがあります。

    m_jointListという名前は、リストを実際には含んでいないので、ここで少し誤解を招くことがあります。リストの最初の要素です。

    これのCoffeeScriptでそれを行う必要があります。

    j = world.m_jointList 
    while j then drawJoint(j, context); j = j.m_next 
    

    そして、それは、JavaScriptでdo...whileをうまく利用してきたでしょう:

    var j = world.m_jointList 
    do { drawJoint(j, context) } while (j = j.m_next) 
    
  • +0

    最初の 'j'は' false'かもしれません – island205

    +0

    @ island205私は 'do ... while'を考えていました:/ fixed。 –

    +0

    しかし、このように 'do {alert(" foo ");} while(false);' execを少なくとも1回は実行できます。 – island205

    0

    はこれがベストです:

    j = world.m_jointList 
    loop 
        break if not j 
        drawJoint j,context 
        j=j.m_next 
    

    はループの意味を説明しています。

    +0

    ループブレイク構文の代わりに 'while j?'を使用します。 – Ricket

    関連する問題