2012-02-02 95 views
1

如何將此循環轉換爲咖啡腳本?與操作循環的咖啡腳本

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

我不明白,即使此javascript循環不管怎麼說,能有人能解釋它,而回答CoffeeScript的一部分嗎? – 2012-02-02 01:27:18

回答

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 [聯合列表](http://kyucon.com/doc/box2d/Box2D/Dynamics/b2World。html#GetJointList()) – Jankeesvw 2012-09-20 06:48:11

1

發生了什麼事在原:

JavaScript有compound for loops。括號內的聲明有三個表達式:for(x; y; z){...}。環路

  • y前一次

    • x運行是這樣的條件,在每次迭代之前進行測試。如果是假的循環將每次迭代

    在此代碼後立即停止

  • z運行,設置j = world.m_jointList,這是在鏈表中的第一項。 for循環的中間部分正在檢查thruthinessj;,並且在每次迭代j設置爲j.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性能,但這樣的工作是相同的。請注意0​​在最後一個對象中未定義。有時會使用尾部的佔位符值來指示鏈的末尾。

    名稱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 2012-02-02 13:51:08

    +0

    @ island205我想'do ... while':/ fixed。 – 2012-02-02 19:54:48

    +0

    但do ... while this'do {alert(「foo」);} while(false);'可以執行至少一次。 – island205 2012-02-03 01:25:18

    0

    這是最好的:

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

    它只是描述了for循環的含義。

    +0

    我會使用'while j?'而不是循環中斷語法。 – Ricket 2012-04-10 22:44:49