Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   цикл for (http://www.flasher.ru/forum/showthread.php?t=121778)

noode 23.02.2009 16:59

цикл for
 
Помогите разобраться с циклом for, знаю что обсуждалось не раз... но...

Код AS1/AS2:

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 мувиков.

VVall 23.02.2009 17:02

Чтобы было десять итераций, нужно либо начинать с 0, либо условие <11.

noode 23.02.2009 17:05

указал 0, рекции никакой.

nOobCrafter 23.02.2009 17:16

Linkage name заданно верно?.. это не тоже самое что и Instance name...

noode 23.02.2009 17:26

объект появляется один по координатам, x=0 y=0

iNils 23.02.2009 17:26

Код AS1/AS2:

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;
}


noode 23.02.2009 17:39

спасибо, разобрался!

Dr.OH 08.03.2009 23:16

в продолжение темы хочу задать вопрос:
есть массив. Любой просто массив. в него добавляются элементы при помощи push(). Т.е.
Код AS1/AS2:

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

Т.е. перечисление идет с конца — сначала последний элемент. потом предпоследний и т.д. А теперь сделаем в принципе то же самое но наоборот.
Код AS1/AS2:

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 идет от последнего добавленного свойства/элемента к первому добавленному

Dr.OH 08.03.2009 23:26

как неудачно. а про это где-нибудь написано, если не секрет?

DarkLight 08.03.2009 23:37

Из хелпа
Цитата:

It iterates over the properties in reverse index order.
А порядок следования свойств в данном случае - порядок их добавления

iNils 09.03.2009 01:15

Можно и от меньшего к большему. Для этого надо сначала применить к массиву метод reverse.

Dr.OH 09.03.2009 02:44

да, но все равно это получается перебор методом "пальцем в небо", т.е. неизвестно какой элемент будет первым.

iNils 09.03.2009 03:56

Если не хотите читать то, что вам пишут, это ваши личные проблемы.

Dr.OH 09.03.2009 10:26

iNils, это вы к чему? Вы сказали, что, если применить к массиву метод reverse, то элементы в нем поменяют свою последовательность. Но при этом по прежнему неизвестно в какой последовательности они будут перечислены, т.е. reverse не дает гарантии, что при использовании for перечисление будет идти с 0 ли с конечного элемента. Более того, при применении метода reverse элементы перечисляются в произвольном поряде, т.е.
Код AS1/AS2:

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

...может я где-то ошибся?
Так и что я не хочу читать?

iNils 09.03.2009 12:38

Стоп. Вы меня запутали. Зачем вам вообще for in для массива?
Код AS1/AS2:

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]);
}


Dr.OH 09.03.2009 20:57

именно, вот мне и было интересно, можно ли сделать for in без всяких ухищрений типа concat() и почему for in так странно и непонятно работает.
Большое спасибо.

iNils 09.03.2009 21:12

Почему непонятно? DarkLight выше процитировал хелп о том, что for in работает как FILO (first in - last out). А сортировка и реверс, это ведь не единая операция, а набор действий: перебора, сравнения, удаления и добавления элементов, что опять же дает FILO.
Если внимательно посмотреть, то можно увидеть закономерность. Для четного числа берутся два центральных элемента, потом следующие от центра и тд. Для нечетного тоже самое, только центральный элемент идет последним.

Dr.OH 09.03.2009 21:55

да, я абсолютно согласен, что это все логично, но только не для массива. FILO абсолютно не предполагает таких операций, как shift и unshift. В данном случае логично предположить, что массив должен работать как очередь с нормальной вставкой элементов в начало и конец очереди. Т.е. вне зависимости от того, в начало мы добавили элемент или в конец, перечисление всегда должно идти в одном и том же направлении. что это за перечисление с конца в начало?
И не совсем понимаю, что значит "можно увидеть закономерность". если я добавил элементы в порядке 1, 2, 3, то reverse должен дать 3, 2, 1, а никак не 2, 1, 3 или что-нибудь типа такого. Вне зависимости от того, при помощи какого метода эти элементы были добавлены.
Надеюсь в AS3 это все реализовано значительно лучше.

Добавлено через 39 секунд
Прошу прощения, наверное мое последнее сообщение. это уже флуд.

iNils 10.03.2009 00:41

Цитата:

FILO абсолютно не предполагает таких операций, как shift и unshift. В данном случае логично предположить, что массив должен работать как очередь с нормальной вставкой элементов в начало и конец очереди.
for..in работает с перечисляемыми свойствами любых объектов. В том числе и для класса Array, то есть, когда вы пользуетесь for..in, элементы массива воспринимаются как свойства (см. Колина Мука в "ActionScript для Flash MX", стр. 299), а не как непосредственно сами элементы. Это ключевой момент.

Цитата:

если я добавил элементы в порядке 1, 2, 3, то reverse должен дать 3, 2, 1, а никак не 2, 1, 3 или что-нибудь типа такого.
А так и есть, reverse - это метод работающий с элементами массива, и он свою работу выполняет - меняет местами элементы относительно их индексов. А вы требуете, чтобы он работал также и со свойствами, а с какой стати?

Dr.OH 10.03.2009 00:58

Вообще жесть. по-моему все абсолютно не логично. и for и reverse работают с экземпляром одного и того же класса - Array, но один работает с ним как с объектом (Object), а другой работает как с массивом (Array). а вот методы push и unshift вообще работают по своему. и это считается нормально? А самое главное, я не понимаю, что заставило разработчиков AS2 так обойтись с массивом, почему for для массивов нельзя было перегрузить? Ведь кроме for нет других способов пройтись по элементам массива, в том случае, если они идут не подряд.
А есть какой-нибудь стандартный класс, который работает как... даже не знаю, как это назвать, как нормальный массив... ну или как сишный dequeue или queue. Где есть вставка в начало, конец, произвольный доступ к элементам и при этом перечисление происходит в одном и том же порядке? или это только в AS3?

iNils 10.03.2009 01:04

Нет никакой проблемы, есть только ваше непонятное желание работать с массивом через for..in, а не через for который для этого и нужен.

Dr.OH 10.03.2009 01:14

Код AS1/AS2:

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, чтобы не столкнуться с ней в будущем. Большое спасибо за помощь.

wvxvw 10.03.2009 01:17

Object.__resolve() вас спасет, перехватываете обращение к свойству - и отдаете какое угодно значение. Типа такого
Код AS1/AS2:

MyClass.prototype.__resolve(p:Object):Object
{
    if (String(p) == "someProperty") return someValue;
    return undefined;
}

ЗЫ. Класс должен быть динамическим, и не наследоваться от массива - а то цифровые значения в ресолв не попадут.

iNils 10.03.2009 01:24

Да не работаете вы с массивом в данном случаи :) Вы работаете с объектом, отсюда и модель другая.
Любую еду можно есть ложкой (проверено двумя годами на камбузе :)), а можно вилкой, но не любую. И способ использования у них не всегда совпадает, вилкой можно прокалывать макароны, а ложкой не получится. Вот вы сейчас пытаетесь именно это сделать :)


Часовой пояс GMT +4, время: 11:58.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.