Петли в coffeescript с операциями - PullRequest
1 голос
/ 02 февраля 2012

Как я могу преобразовать этот цикл в coffeescript?

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

Ответы [ 3 ]

2 голосов
/ 02 февраля 2012
while j = (unless j? then first else j.next)
  do stuff

Но в целом, что не так с простым написанием циклов for с кодом инициализации в виде отдельного оператора, например, j=first; while j then ...; j=j.next?

edit: Или, возможно:

while j = j?.next ? first
  do stuff
1 голос
/ 02 февраля 2012

Что происходит в оригинале:

В Javascript есть состав для петель .Объявление внутри скобки имеет три выражения: for(x; y; z){...}.

  • x выполняется один раз до того, как цикл
  • y является условием, проверяемым перед каждой итерацией.Если значение равно false, цикл остановится
  • z запускается один раз после каждой итерации

В этом коде вы устанавливаете j = world.m_jointList, который является первым элементом в связанном списке.Средняя часть цикла for проверяет правдоподобность из j;, и после каждой итерации j устанавливается в j.m_next, что является указателем на следующий объект в цепочке.Он заканчивается, когда j оценивается как ложное (в данном случае, вероятно, 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

И это было бы хорошим использованием do...while в javascript:

var j = world.m_jointList
do { drawJoint(j, context) } while (j = j.m_next)
0 голосов
/ 02 февраля 2012

это лучшее:

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

просто описывает, что означает цикл for.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...