Просмотр полной версии : цикл for
Помогите разобраться с циклом for, знаю что обсуждалось не раз... но...
for(var i:Number = 1; i<10; i++){
attachMovie("t1", "t1"+i, this.getNextHighestDepth());
t1._x=Math.random()*100;
t1._y=Math.random()*100;
}
надо что бы при загрузке появилось 10 мувиков.
Чтобы было десять итераций, нужно либо начинать с 0, либо условие <11.
указал 0, рекции никакой.
nOobCrafter
23.02.2009, 17:16
Linkage name заданно верно?.. это не тоже самое что и Instance name...
объект появляется один по координатам, x=0 y=0
for(var i:Number = 1; i<10; i++){
var mc:MovieClip = this.attachMovie("t1", "t1"+i, this.getNextHighestDepth());
mc._x=Math.random()*100;
mc._y=Math.random()*100;
}
в продолжение темы хочу задать вопрос:
есть массив. Любой просто массив. в него добавляются элементы при помощи push(). Т.е.var arr:Array = new Array();
arr.push(1);
arr.push(2);
arr.push(3);
for (i in arr) trace(i+": "+arr[i]);
// получаем
// 2: 3
// 1: 2
// 0: 1
Т.е. перечисление идет с конца — сначала последний элемент. потом предпоследний и т.д. А теперь сделаем в принципе то же самое но наоборот.var arr:Array = new Array();
arr.unshift(3);
arr.unshift(2);
arr.unshift(1);
for (i in arr) trace(i+": "+arr[i]);
// получаем
// 0: 1
// 1: 2
// 2: 3
Внимание! вопрос! Почему перечисление for проходит в разной последовательности? как сделать, чтобы for всегда выполнялся либо с меньшего индекса к большему, либо с большего к меньшему?
DarkLight
08.03.2009, 23:23
Никак. В as1/2 for..in идет от последнего добавленного свойства/элемента к первому добавленному
как неудачно. а про это где-нибудь написано, если не секрет?
DarkLight
08.03.2009, 23:37
Из хелпа
It iterates over the properties in reverse index order.
А порядок следования свойств в данном случае - порядок их добавления
Можно и от меньшего к большему. Для этого надо сначала применить к массиву метод reverse.
да, но все равно это получается перебор методом "пальцем в небо", т.е. неизвестно какой элемент будет первым.
Если не хотите читать то, что вам пишут, это ваши личные проблемы.
iNils, это вы к чему? Вы сказали, что, если применить к массиву метод reverse, то элементы в нем поменяют свою последовательность. Но при этом по прежнему неизвестно в какой последовательности они будут перечислены, т.е. reverse не дает гарантии, что при использовании for перечисление будет идти с 0 ли с конечного элемента. Более того, при применении метода reverse элементы перечисляются в произвольном поряде, т.е.
var arr:Array = new Array();
arr.push(1);
arr.push(2);
arr.push(3);
arr.reverse();
for (i in arr) trace(i+": "+arr[i]);
// получаем
// 2: 1
// 0: 3
// 1: 2
...может я где-то ошибся?
Так и что я не хочу читать?
Стоп. Вы меня запутали. Зачем вам вообще for in для массива?
var arr:Array = new Array ();
arr.push (0);
arr.push (1);
arr.push (2);
arr.push (3);
arr.push (4);
arr.push (5);
arr.reverse ();
arr = arr.concat ();
trace (arr);
for (i in arr) {
trace (i + ": " + arr[i]);
}
именно, вот мне и было интересно, можно ли сделать for in без всяких ухищрений типа concat() и почему for in так странно и непонятно работает.
Большое спасибо.
Почему непонятно? DarkLight выше процитировал хелп о том, что for in работает как FILO (first in - last out). А сортировка и реверс, это ведь не единая операция, а набор действий: перебора, сравнения, удаления и добавления элементов, что опять же дает FILO.
Если внимательно посмотреть, то можно увидеть закономерность. Для четного числа берутся два центральных элемента, потом следующие от центра и тд. Для нечетного тоже самое, только центральный элемент идет последним.
да, я абсолютно согласен, что это все логично, но только не для массива. FILO абсолютно не предполагает таких операций, как shift и unshift. В данном случае логично предположить, что массив должен работать как очередь с нормальной вставкой элементов в начало и конец очереди. Т.е. вне зависимости от того, в начало мы добавили элемент или в конец, перечисление всегда должно идти в одном и том же направлении. что это за перечисление с конца в начало?
И не совсем понимаю, что значит "можно увидеть закономерность". если я добавил элементы в порядке 1, 2, 3, то reverse должен дать 3, 2, 1, а никак не 2, 1, 3 или что-нибудь типа такого. Вне зависимости от того, при помощи какого метода эти элементы были добавлены.
Надеюсь в AS3 это все реализовано значительно лучше.
Добавлено через 39 секунд
Прошу прощения, наверное мое последнее сообщение. это уже флуд.
FILO абсолютно не предполагает таких операций, как shift и unshift. В данном случае логично предположить, что массив должен работать как очередь с нормальной вставкой элементов в начало и конец очереди.for..in работает с перечисляемыми свойствами любых объектов. В том числе и для класса Array, то есть, когда вы пользуетесь for..in, элементы массива воспринимаются как свойства (см. Колина Мука в "ActionScript для Flash MX", стр. 299), а не как непосредственно сами элементы. Это ключевой момент.
если я добавил элементы в порядке 1, 2, 3, то reverse должен дать 3, 2, 1, а никак не 2, 1, 3 или что-нибудь типа такого.А так и есть, reverse - это метод работающий с элементами массива, и он свою работу выполняет - меняет местами элементы относительно их индексов. А вы требуете, чтобы он работал также и со свойствами, а с какой стати?
Вообще жесть. по-моему все абсолютно не логично. и for и reverse работают с экземпляром одного и того же класса - Array, но один работает с ним как с объектом (Object), а другой работает как с массивом (Array). а вот методы push и unshift вообще работают по своему. и это считается нормально? А самое главное, я не понимаю, что заставило разработчиков AS2 так обойтись с массивом, почему for для массивов нельзя было перегрузить? Ведь кроме for нет других способов пройтись по элементам массива, в том случае, если они идут не подряд.
А есть какой-нибудь стандартный класс, который работает как... даже не знаю, как это назвать, как нормальный массив... ну или как сишный dequeue или queue. Где есть вставка в начало, конец, произвольный доступ к элементам и при этом перечисление происходит в одном и том же порядке? или это только в AS3?
Нет никакой проблемы, есть только ваше непонятное желание работать с массивом через for..in, а не через for который для этого и нужен.
var arr:Array = new Array();
arr.push(0);
arr.push(1);
arr.push(2);
delete arr[1];
arr['some'] = 3;
for (i in arr) trace(i+": "+arr[i]);Ладно, прошу прощения за беспокойство. Я свою проблему уже давно решил, мне просто было интересно почем и как именно реализована работа с массивами во flash, чтобы не столкнуться с ней в будущем. Большое спасибо за помощь.
Object.__resolve() вас спасет, перехватываете обращение к свойству - и отдаете какое угодно значение. Типа такого
MyClass.prototype.__resolve(p:Object):Object
{
if (String(p) == "someProperty") return someValue;
return undefined;
}
ЗЫ. Класс должен быть динамическим, и не наследоваться от массива - а то цифровые значения в ресолв не попадут.
Да не работаете вы с массивом в данном случаи :) Вы работаете с объектом, отсюда и модель другая.
Любую еду можно есть ложкой (проверено двумя годами на камбузе :)), а можно вилкой, но не любую. И способ использования у них не всегда совпадает, вилкой можно прокалывать макароны, а ложкой не получится. Вот вы сейчас пытаетесь именно это сделать :)
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.