Условно поменять направление на «цикл»? - PullRequest
2 голосов
/ 17 ноября 2010

Можно ли условно изменить направление цикла for в ActionScript?

Пример:

for(if(condition){var x = 0; x<number; x++}else{var x=number; x>0; x--}){
  //do something
}

Ответы [ 3 ]

9 голосов
/ 17 ноября 2010

Интересное требование. Один из способов сохранить это:

var start, loop_cond, inc; 
if(condition) 
{ 
    start = 0; 
    inc = 1; 
    loop_cond = function(){return x < number}; 
} 
else 
{ 
    start = number - 1; 
    inc = -1; 
    loop_cond = function(){return x >= 0}; 
} 
for(var x = start; loop_cond(); x += inc) 
{ 
    // do something
}

Мы устанавливаем начальное значение, функцию для условия завершения и положительное или отрицательное приращение. Затем мы просто вызываем функцию и используем += для увеличения или уменьшения.

6 голосов
/ 17 ноября 2010

ActionScript имеет троичный оператор, поэтому вы можете сделать что-то вроде:

for (var x = cond ? 0 : number; cond ? x < number : x > 0; cond ? x++ : x--) {
}

Но это довольно уродливо. : -)

Вам также может понадобиться / захотеть поставить несколько скобок вокруг этого. Я не уверен в приоритете оператора.

Вы также можете рассмотреть возможность использования функции более высокого порядка. Представьте, что у вас есть:

function forward (count, func) {
    for (var x = 0; x < count; x++) {
        func(x);
    }
}

function backward (count, func) {
    for (var x = count - 1; x >= 0; x--) {
        func(x);
    }
}

Тогда вы могли бы сделать:

(condition ? forward : backward) (number, function (x) {
     // Your loop code goes here
})
1 голос
/ 17 ноября 2010

Вы, вероятно, хотите вместо while цикл:

var continueLooping, x;

if(condition)
{
  x = 0
  continueLooping = (x < number);
}
else
{
  x = number;
  continueLooping = (x > 0);
}

while (continueLooping)
{
  // do something
  if(condition)
  {
    x++;
    continueLooping = (x < number);
  }
  else
  {
    x--;
    continueLooping = (x > 0);
  }
}

Если вы действительно хотите цикл for, вам следует использовать два из них:

function doSomething()
{
  //doSomething
}

if(condition)
{
  for(var x = 0; x<number; x++)
  {
    doSomething(x);
  }
}
else
{
  for(var x=number; x>0; x--})
  {
    doSomething(x);
  }
}
...