このループをcoffeescriptに変換するにはどうすればよいですか?操作のあるcoffeescriptのループ
for (var j = world.m_jointList; j; j = j.m_next) {
drawJoint(j, context);
}
このループをcoffeescriptに変換するにはどうすればよいですか?操作のあるcoffeescriptのループ
for (var j = world.m_jointList; j; j = j.m_next) {
drawJoint(j, context);
}
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
これは受け入れられる回答である必要があります!私はBox2D [Joint List](http://kyucon.com/doc/box2d/Box2D/Dynamics/b2World)に使用しています。html#GetJointList()) – Jankeesvw
:
Javascriptがcompound for loopsを持っています。かっこ内の宣言には、for(x; y; z){...}
という3つの式があります。ループの前に一度
x
実行y
は、各反復の前にテストされ、条件です。それが偽ならループは一度、このコードではすべての反復後
z
の実行を停止します、あなたは、リンクリストの最初の項目であるj = world.m_jointList
を設定します。 for
ループの中間部分は、thruthinessがj;
であるかどうかをチェックし、各繰り返し後に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
のプロパティとして存在していませんが、これは同じように動作します。最後のオブジェクトで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)
はこれがベストです:
j = world.m_jointList
loop
break if not j
drawJoint j,context
j=j.m_next
はループの意味を説明しています。
ループブレイク構文の代わりに 'while j?'を使用します。 – Ricket
私はこのJavaScriptのループをとにかく理解していません。誰かがcoffeescriptの部分に答える際に説明できますか? –