Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 24.06.2011, 19:18
Zolza вне форума Посмотреть профиль Отправить личное сообщение для Zolza Найти все сообщения от Zolza
  № 1  
Ответить с цитированием
Zolza

Регистрация: Jun 2011
Сообщений: 31
По умолчанию Как получить тип переменной?

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

1) Нужно получить тип переменной(переменная еще не содержит значение)
2) Присвоить этой же переменной новое значение на основе полученного типа:
Код AS3:
someVar = new ПолученныйТип();
Что было:
Код AS3:
var spr:Sprite;
trace(typeof(spr)); // object
 
var str:String;
trace(typeof(str)); // string
Выводит object в случае со спрайтом. Значит не всегда будет работать так, как нужно. На этом мысль заканчивается.

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

Старый 24.06.2011, 20:15
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 2  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
Только объект может иметь какой-либо тип. Т.о. вы проверили тип объекта по ссылке.
__________________
Воспитан в TimeZero. Работаю в Mail.ru.

Старый 24.06.2011, 20:38
goodguy вне форума Посмотреть профиль Найти все сообщения от goodguy
  № 3  
Ответить с цитированием
goodguy
Banned
[+1 05.11.11]
[+1 09.08.11]

Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
Цитата:
Как получить заветный тип? Ну и далее по пункту 2, как такое делается?
Не представляю, где это может понадобиться в реальности, но сделать переменную, с типом данных, соответствующим другой переменной можно довольно просто:

Код AS3:
var yourVariable:SomeClass = new SomeClass();
 
var someCrap:Class = getDefinitionByName(getQualifiedClassName(yourVariable)) as Class;
var v:Object = new someCrap();
trace(v); // [object SomeClass]
но у меня вопрос, зачем создавать "пустую" переменную какого-то определенного типа?


Последний раз редактировалось goodguy; 24.06.2011 в 21:16.
Старый 25.06.2011, 00:56
S-ed вне форума Посмотреть профиль Отправить личное сообщение для S-ed Найти все сообщения от S-ed
  № 4  
Ответить с цитированием
S-ed
 
Аватар для S-ed

Регистрация: Jul 2001
Адрес: SPb.RU
Сообщений: 148
Отправить сообщение для S-ed с помощью ICQ
Код AS3:
var spr:Sprite = new Sprite;
trace(spr); // [object Sprite]
Не надо сравнивать работу с классами и примитивными типами...
__________________
RTFM

Старый 25.06.2011, 04:04
Nooob вне форума Посмотреть профиль Отправить личное сообщение для Nooob Найти все сообщения от Nooob
  № 5  
Ответить с цитированием
Nooob
 
Аватар для Nooob

Регистрация: Mar 2007
Сообщений: 319
Код AS3:
var spr:Sprite = new Sprite;
trace(spr as Sprite); //[object Sprite]
trace(spr as String); //null

Старый 25.06.2011, 08:19
Zolza вне форума Посмотреть профиль Отправить личное сообщение для Zolza Найти все сообщения от Zolza
  № 6  
Ответить с цитированием
Zolza

Регистрация: Jun 2011
Сообщений: 31
Цитата:
Сообщение от goodguy Посмотреть сообщение
Не представляю, где это может понадобиться в реальности
Представьте: Есть неск-ко функций, использующих определенный набор объектов(переменных). Функции связаны, управляющий элемент ходит туда-сюда по этим функциям. Внутри функций по мере надобности инициализируются некоторые из объектов(переменных):
Код 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 в рамках такого алгоритма не то, чтобы получить значение не может. Даже считать из нее ссылку на класс нельзя. А значит я либо ничего не понял, либо придется оставить наполеоновские планы и решать проблему "в лоб". Мб кто-то с подобным сталкивался и подскажет, что тут еще можно сделать.

Старый 25.06.2011, 10:03
incoob вне форума Посмотреть профиль Отправить личное сообщение для incoob Найти все сообщения от incoob
  № 7  
Ответить с цитированием
incoob

Регистрация: Mar 2008
Сообщений: 215
У вас код
Код 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;
		}
Но такой подход достаточно корявый, и лучше вам поменять логику работы приложения, чтобы не возникало описанной вами ситуации.

Старый 25.06.2011, 10:04
goodguy вне форума Посмотреть профиль Найти все сообщения от goodguy
  № 8  
Ответить с цитированием
goodguy
Banned
[+1 05.11.11]
[+1 09.08.11]

Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
Zolza, может я опять что-то не совсем так понял, но для таких целей в АС3 есть звездочка * (wildcard).
т.е., создаем переменную без типа:
Код AS3:
var someVariable:*;
И, соответственно, можем в дальнейшем присвоить ей любой тип

Старый 25.06.2011, 10:37
nOobCrafter вне форума Посмотреть профиль Отправить личное сообщение для nOobCrafter Найти все сообщения от nOobCrafter
  № 9  
Ответить с цитированием
nOobCrafter

Регистрация: Nov 2008
Сообщений: 894
Записей в блоге: 1
если классы ваши собственные а не нативные, то можете переопределить метод toString() и выводить то что вам угодно.. так же есть оператор проверки типа "is" (myValue is Sprite)

Старый 25.06.2011, 14:59
ChuwY вне форума Посмотреть профиль Отправить личное сообщение для ChuwY Посетить домашнюю страницу ChuwY Найти все сообщения от ChuwY
  № 10  
Ответить с цитированием
ChuwY
 
Аватар для ChuwY

Регистрация: Nov 2009
Адрес: Тула / Москва
Сообщений: 734
Отправить сообщение для ChuwY с помощью ICQ Отправить сообщение для ChuwY с помощью Skype™
Вместо
Код AS3:
getDefinitionByName(getQualifiedClassName(spr1)) as Class
проще использовать
Код AS3:
(spr1 as Object).constructor
Но здесь это не поможет.

Вообще, думаю, что подход неверен.
Почитайте про пул объектов.
Как раз то, что вам нужно.
__________________
9 из 10 голосов в моей голове сказали наркотикам "НЕТ"
Мои ачивки: художник-паразит.

Создать новую тему Ответ Часовой пояс GMT +4, время: 21:40.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Теги
typeof() , извлечение типа

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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