Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Как получить тип переменной? (http://www.flasher.ru/forum/showthread.php?t=158890)

-De- 25.06.2011 16:51

Я бы предложил такое:
Код AS3:

private var assetClassInfo:Object = {"var1":Sprite, "var2":Shape};
private var var1:Sprite;
private var var2:Shape;//да, дублирование, гадость, но жить можно
private function checkObj(...objs):void
{
        for each(var s:String in objs)
        {
                if(!this[s]) this[s] = new assetClassInfo[s];
        }
}
//использование
public function functionWithVar2(whatever:Whatever):WhateverElse
{
        checkObj("var2");
//var2 определена
}


Zolza 25.06.2011 17:08

Цитата:

У вас код
Код AS3:

if(!var2) = new var2Class();

компилируется?
Это опечатка в посте, будем считать ее в данном контексте псевдо-кодом :D
Цитата:

То есть objs[i] у вас, скорее всего, null (раз вы работаете с объектами). Потом вы передаете этот null в getQualifiedClassName. И что же вы хотите получить? Тем более вы не сможете инициализировать поле класса, так как не передаете в метод ссылку на него (а передаете вы null). Так что ваш подход реализовать невозможно таким способом.
Да, здесь я ошибся.
Цитата:

Zolza, может я опять что-то не совсем так понял, но для таких целей в АС3 есть звездочка * (wildcard).
т.е., создаем переменную без типа:
Про звездочку в курсе, это не мой случай. Нужно было получить инфу о типе, и на основе этого создать объект. Но инфу о типе из объекта null получить не удалось. Просто только сейчас пришло понимание того, что во время выполнения флэшке плевать, как я назвал переменную и какой тип данных она может иметь.
Цитата:

если классы ваши собственные а не нативные, то можете переопределить метод toString() и выводить то что вам угодно.. так же есть оператор проверки типа "is" (myValue is Sprite)
В случае с is или as нужно было бы делать свитчер, тут опять не мой случай. А вот с переопределением toString() идея интересная, возьму на заметку.
Цитата:

Вообще, думаю, что подход неверен.
Почитайте про пул объектов.
Как раз то, что вам нужно.
Беглый просмотр по пулу подтвердил, что это как раз то самое. Если у вас есть какие-нибудь интересные(спрятанные в закромах гугла и известные только избранным) ссылки на данную тему, поделитесь.
Цитата:

Я бы предложил такое
Я так понимаю это что-то вроде ассоциативного массива "имя переменной - тип этой переменной"?

semenyakinVS 25.06.2011 18:07

Может, поможет вот это обсуждение:

Проблема с typeOf()

S-ed 25.06.2011 22:01

Nooob
Null тк преобразование неудачное. Нельзя экземпляр класса в строку преобразовывать. Для этого есть toString().

Zolza
typeOf - как уже сказали - оператор, он различает всего 12 типов данных.

Вы тут обсуждает как "правильно" писать быдлокод?
Пытаетесь переложить функцию определения типа данных на компилятор?
Почему бы не ввести новый тип данных, вроде псевдо булевских переменных, или что-то из "стохастического программирования"?
Не хотел бы я разбираться в Вашем коде.

Пока не отработал конструктор - нет никакого класса.
В коде, опледеление типа нужно только для того чтоб компилятор работал как надо, чтоб не тратить часы на RTE.

Не нравятся типизированные переменные, пользуйтесь нетипизированными (динамическими).
(как вариант храните тип в имени переменной)

Zolza 26.06.2011 07:46

S-ed, какой быдлокод, какое стахановское программирование? Кто все эти люди?. Выяснили уже, что нужен мне пул объектов, или сделать через ассоциативный массив, как частный способ. Всё.

goodguy 26.06.2011 11:28

Цитата:

или сделать через ассоциативный массив
Через объект. В АС3 нет ассоциативных массивов

S-ed 26.06.2011 11:39

Zolza
Вы хотели пул объектов без самих объектов.

Вот через Object:
Код AS3:

var objectsArray:Object = new Object;
for(var i = 0; i < 5; i++){
    objectsArray["myVariableNum_" + i] = new Sprite;
}
 
for(var obj in objectsArray){
 trace(obj, "=", objectsArray[obj]);
}

Трейс:
Код:

myVariableNum_1 = [object Sprite]
myVariableNum_4 = [object Sprite]
myVariableNum_2 = [object Sprite]
myVariableNum_0 = [object Sprite]
myVariableNum_3 = [object Sprite]


-De- 26.06.2011 12:06

goodguy - Object, Dictionary и Array - ассоциативные массивы.
А вообще по-моему автору надо писать
Код AS3:

if(!var2) var2 = new var2Class();

и не страдать фигнёй. Это писать практически так же быстро, как и checkObj(var2), даже если там штук 5-10 таких переменных, но понятнее и работает быстрее.

S-ed 26.06.2011 12:15

-De-
Вы взяли код из #6? =)
"Человеку" хочется чтоб он мог отличить var2 от var1 когда передает их в функцию.

Zolza 26.06.2011 12:26

Цитата:

Сообщение от S-ed (Сообщение 1006600)
Вы хотели пул объектов без самих объектов.

Вообще, с моим подходом, я много чего хотел "без самих объектов". С этим разобрался.
Цитата:

Сообщение от -De-
А вообще по-моему автору надо писать...

У меня так и было. Только много и в разных местах. Захотелось сделать красиво, так сказать, "вынести общий множитель за скобки". Ну а ваше решение из поста 11 - как раз тот самый "общий множитель".


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

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