PDA

Просмотр полной версии : Синтаксис создания переменной


meliot
03.04.2013, 16:49
Подскажите пожалуйста как правильно создать переменную, название которой состоит из нескольких строк.
Примерно вот так:

var m =1;
var "index" + m + "speed" = 0;

Hauts
03.04.2013, 16:59
Для подобных целей проще всего использовать поля объекта (поправьте меня, если я ошибаюсь):


var settingsObject:Object = {};

settingsObject["some_" + counter + "_var"] = 125;


Но лучше таким не пользоваться. Лучше заведите массив объектов:


var settingsArray:Array = [];

settingsArray[ counter ] = {};
settingsArray[ counter ].someProperty = 125;

iflamberg
03.04.2013, 16:59
Так нельзя. Можно так:

var o:Object = {};
o["index"+m+"speed"] = 0;

Довольно медленно. Желательно использовать просто массивы.

GBee
03.04.2013, 17:14
если класс динамический, то можно пихать через this

this["index" + m + "speed"] = 0;


Но как сказали выше, это не очень хорошо, но местами очень удобно.

Александр Мостовой
03.04.2013, 17:30
Декларация переменных создана для четкого регламентирования поведения приложения. Грубо говоря тыкать себя носом что бы не делать того что не задумал. Декларировать переменные с переменными нельзя т.к. это противоречит логике декларации. А вот создать переменную можно.
this["index" + m + "speed"]
хоть и не нужно. При этом она от этого не станет задекларированной: т.е. компилятор вам не даст обратиться к index22speed без квадратных скобок.

На самом деле тип данных MovieClip - динамический, как и Object, например. Это означает что можно динамически создавать переменные (чего не можем делать в Sprite); Компилятор ругается в воспитательных целях.
var thisMC:MovieClip = this as MovieClip;
thisMC.index33speed = 100500;
//Так мы можем обращаться к любым новам переменным без декларации.

Теперь вопрос. Расскажите что вас заставляет избегать использования массива?

iflamberg
03.04.2013, 17:37
Меня обычно заставляют разреженные массивы вида map[x+"_"+y] где не требуется скорость, но иногда требуется пробежаться по всем элементам массива. Удобно.

Александр Мостовой
03.04.2013, 17:46
Это можно сделать вот так:
var array:Array = [];
array[5] = "a";
array[10] = "b";
array[20] = "c";
for (var key:String in array) {
trace(key, array[key]);
}

А, вы имеете ввиду случай DtataGrid например? Ну Adobe тоже практикуют такое в компонентах Flash но я как-то скептически отношусь, хотя может это и быстрее чем какой-нибудь getIndexByXY(x, y)

meliot
03.04.2013, 18:29
Всем спасибо, получилось!