Форум 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)

Zolza 24.06.2011 19:18

Как получить тип переменной?
 
Думаю я далеко не первый кто такое спрашивает >_<

1) Нужно получить тип переменной(переменная еще не содержит значение)
2) Присвоить этой же переменной новое значение на основе полученного типа:
Код AS3:

someVar = new ПолученныйТип();

Что было:
Код AS3:

var spr:Sprite;
trace(typeof(spr)); // object
 
var str:String;
trace(typeof(str)); // string

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

Как получить заветный тип? Ну и далее по пункту 2, как такое делается?

dimarik 24.06.2011 20:15

Только объект может иметь какой-либо тип. Т.о. вы проверили тип объекта по ссылке.

goodguy 24.06.2011 20:38

Цитата:

Как получить заветный тип? Ну и далее по пункту 2, как такое делается?
Не представляю, где это может понадобиться в реальности, но сделать переменную, с типом данных, соответствующим другой переменной можно довольно просто:

Код AS3:

var yourVariable:SomeClass = new SomeClass();
 
var someCrap:Class = getDefinitionByName(getQualifiedClassName(yourVariable)) as Class;
var v:Object = new someCrap();
trace(v); // [object SomeClass]

но у меня вопрос, зачем создавать "пустую" переменную какого-то определенного типа?

S-ed 25.06.2011 00:56

Код AS3:

var spr:Sprite = new Sprite;
trace(spr); // [object Sprite]

Не надо сравнивать работу с классами и примитивными типами...

Nooob 25.06.2011 04:04

Код AS3:

var spr:Sprite = new Sprite;
trace(spr as Sprite); //[object Sprite]
trace(spr as String); //null


Zolza 25.06.2011 08:19

Цитата:

Сообщение от goodguy (Сообщение 1006294)
Не представляю, где это может понадобиться в реальности

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

function foo1(){
var1 = new var1Class();
var2 = new var2Class();
}
 
function foo2(){
var2 = new var2Class();
}

Чтобы в памяти не плодить кучи новых объектов, рационально их использовать повторно. То есть если объект уже получил значение, то его заново не создаем, а просто меняем необходимые свойства:
Код AS3:

function foo2(){
if(!var2) = new var2Class();
}

Вот на этом месте я задал себе вопрос - я что в каждой подобной foo№() должен такие проверки проводить? Не красиво и громоздко получается. Ладно, если будет одна точка входа в систему функций, там получится, что в любой момент времени известно, какие объекты созданы, и можно ручками написать такие проверки, сведя их к минимуму. А если точек входа несколько?
Цитата:

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

Тут конечно можно сказать, мол сразу давай всем своим переменным значения и не мучайся. Но зачем мне иметь эти переменные тогда, когда они фактические еще нигде не используются?

Вот и чтобы избавится от копипаста одинаковых проверок, решено было вынести подобный алгоритм в отдельную функцию, которая(спасибо за инфу о нужных функциях) примерно выглядит вот так:
Код AS3:

function checkObj(...objs):void
{
        for(var i:int = 0; i < objs.length; i++)
        {
                if(!objs[i])
                {
                        assetClass = getDefinitionByName(getQualifiedClassName(obj[i])) as Class;
                        objs[i] = new assetClass();
                }
        }
}

Тут можно улыбнуться и расслабиться, но:

Код AS3:

import flash.display.Sprite;
 
var assetClass:Class;
var spr1:Sprite = new Sprite();
var spr2:Sprite;
 
assetClass = getDefinitionByName(getQualifiedClassName(spr1)) as Class;
trace(assetClass);
// [class Sprite]
 
 
// А если так:
assetClass = getDefinitionByName(getQualifiedClassName(spr2)) as Class;
// ReferenceError: Error #1065: Переменная null не определена.

Итог - переменная null в рамках такого алгоритма не то, чтобы получить значение не может. Даже считать из нее ссылку на класс нельзя. А значит я либо ничего не понял, либо придется оставить наполеоновские планы и решать проблему "в лоб". Мб кто-то с подобным сталкивался и подскажет, что тут еще можно сделать.

incoob 25.06.2011 10:03

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

if(!var2) = new var2Class();

компилируется?

Смотрите, что вы делаете: вначале пишете
Код AS3:

if(!objs[i])

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

Меняйте логику работы. Например, напишите геттер и везде используйте его, а не поле класса:
Код AS3:

                private var _sprite:Sprite;
 
                public function get sprite():Sprite
                {
                        if (!_sprite)
                        {
                                _sprite = new Sprite();
                        }
                        return _sprite;
                }

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

goodguy 25.06.2011 10:04

Zolza, может я опять что-то не совсем так понял, но для таких целей в АС3 есть звездочка * (wildcard).
т.е., создаем переменную без типа:
Код AS3:

var someVariable:*;

И, соответственно, можем в дальнейшем присвоить ей любой тип

nOobCrafter 25.06.2011 10:37

если классы ваши собственные а не нативные, то можете переопределить метод toString() и выводить то что вам угодно.. так же есть оператор проверки типа "is" (myValue is Sprite)

ChuwY 25.06.2011 14:59

Вместо
Код AS3:

getDefinitionByName(getQualifiedClassName(spr1)) as Class

проще использовать
Код AS3:

(spr1 as Object).constructor

Но здесь это не поможет.

Вообще, думаю, что подход неверен.
Почитайте про пул объектов.
Как раз то, что вам нужно.


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

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