Форум Flasher.ru

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

MerlinTwi 06.08.2008 11:50

Как отличить int от Number
 
Код:

var a:int = 2;
var b:Number = 2;

trace(a is int); // true
trace(b is int); // true

trace(a is Number); // true
trace(b is Number); // true

trace(typeof(a)); // number
trace(typeof(b)); // number

Собственно вопрос, как определить, что переменная "a" имеет тип int, а переменная "b" тип Number, не зависимо от значения, присвоенного переменной.

etc 06.08.2008 13:43

Код:

var a:int = 2;
var b:Number = 2;
trace(describeType(this).variable.(@name=='b').@type);

Шутка, безусловно. А вообще, определять надо тип не у значения, а тип самой переменной, но не вижу никаких способов это сделать.

wvxvw 06.08.2008 14:15

Код:

var a:Number = 2;
var b:int = 2;
function checkInt(i:int, n:Number):Boolean
{
        i *= Math.PI;
        n *= Math.PI;
        return i == n;
}
trace(checkInt(b, a));

Ну еще такой вариант :D

Dima_DPE 06.08.2008 14:15

Есть одна шальная идея, правда работает вроде, но не "не зависимо от значения, присвоенного переменной"
Код:

var i:int = 2; // эту переменную надо проверить
var t:Number = i; //это временная
i+=0.5; // прибавим, а потом отнимим
trace(i == t+0.5); // false - значит i - int
i-=0.5; // отнимаем что прибавляли
// вот только i тут будет равна 1 =(, но думаю это поправимо

а если так
Код:

var i:Number = 2;
var t:Number = i;
i+=0.5;
trace(i == t+0.5); // true- значит i - number
i-=0.5;


etc 06.08.2008 14:24

Цитата:

Сообщение от wvxvw (Сообщение 756594)
Код:

var a:Number = 2;
var b:int = 2;
function checkInt(i:int, n:Number):Boolean
{
        i *= Math.PI;
        n *= Math.PI;
        return i == n;
}
trace(checkInt(b, a));

Ну еще такой вариант :D

Код:

var a:Number = 2;
var b:int = 2;
function checkInt(i:int, n:Number):Boolean
{
        i *= Math.PI;
        n *= Math.PI;
        return i == n;
}
trace(checkInt(b, a)); // false
trace(checkInt(a, b)); // false


wvxvw 06.08.2008 14:28

Естесственно, а что были сомнения? Мы же сравниваем тип аргументов, а не переменных =) я специально в примере подставил int вместо Number, чтобы такого вопроса не возникло.

т.е. trace(checkInt(a, a)); и trace(checkInt(b, b)); тоже выдадут false

MerlinTwi 06.08.2008 14:35

А вопрос был в определении именно типа переменной ;)

wvxvw 06.08.2008 15:23

Ну, тогда только describeType =) uint, int и Number взаимозаменимы и всегда берутся по значению, так что если значение одинаковое, то и переменные будут одинаковыми... поэтому и
Код:

var a:Number = 2;
var b:int = 2;
trace(getQualifiedClassName(a)); //int
trace(getQualifiedClassName(b)); //int


2morrowMan 06.08.2008 19:49

Наверное это оптимизация AS3/FlashPlayer 9.

etc 07.08.2008 00:54

Цитата:

Сообщение от MerlinTwi (Сообщение 756608)
А вопрос был в определении именно типа переменной ;)

Я боюсь, что задача решения в общем случае не имеет, переменная может вообще не иметь определенного типа.

Tfp 07.08.2008 02:23

Код:

var a:Number = 2;
var b:int = 2;
function checkInt(obj:Object,i:String) {
        var old = obj[i];
        obj[i]+=.1;
        if (old==obj[i]) {
                trace("=)");
        } else {
                obj[i]=old;
                trace("=(");
        }
}

checkInt(this,'a');// =(
checkInt(this,'b');// =)
trace(b);//2
trace(a);//2


wvxvw 07.08.2008 03:39

Код:

var a:Number = Number.MAX_VALUE;
var b:int = int.MAX_VALUE;
function checkInt(obj:Object,i:String):void
{
        var old = obj[i];
        obj[i]+=.1;
        if (old==obj[i])
        {
                trace("=)");
        } else {
                obj[i]=old;
                trace("=(");
        }
}

checkInt(this,'a');// =)
checkInt(this,'b');// =)
trace(b);//2147483647
trace(a);//1.79769313486231e+308

=)

Tfp 07.08.2008 04:24

Код:

var a:Number =Number.MAX_VALUE;
var b:int =int.MAX_VALUE;
function checkInt(obj:Object,i:String):void
{
      //  if (!(variable_exist(obj[i])))
      //  {
      //      trace("you idiot, there no such variable!!...freakin noobs, i need some to dring..eh life sucks")
      //      return ;
      //  }

        if (!(obj[i] is Number))
        {
                trace("f*ck, this is string or what?")
                return ;
        }
       
        if (obj[i]>int.MAX_VALUE)
        {
                trace("god deam it, this is bigger than int =(")
                return ;
        }
       
        var side;
        if (obj[i]>0) side=.1 else side=-.1
        var old = obj[i];
        obj[i]+=side;
        if (old==obj[i])
        {
                trace("=)");
        } else {
                obj[i]=old;
                trace("=(");
        }
}

checkInt(this,'a');// =(
checkInt(this,'b');// =)
trace(b);//2147483647
trace(a);//1.79769313486231e+308

^__^

ramshteks 07.08.2008 05:11

я конечно может не в тему скажу, но как насчет вместо использования стандартных int uint и number написать что нить вроде прстеньких классиков хранящих тока значение и текстовую константу с типом переменной?
немного муторно...
но может я что то не понял...

wvxvw 07.08.2008 11:57

А есть еще NaN и MIN_VALUE ;)

terbooter 07.08.2008 13:35

Хочу полюбопытствовать, а где могла возникнуть такая задача?

Tfp 07.08.2008 19:24

а с MIN_VALUE кста работает)
и частично с NaN(NaN после выполнения функции у int волшебним способом превращаеться в 0)... вощем афтару вполне возможно и не нужна универсальная функция на все случаи))

MerlinTwi 15.08.2008 21:15

Цитата:

Сообщение от terbooter (Сообщение 756847)
Хочу полюбопытствовать, а где могла возникнуть такая задача?

Я готовлю данные к отправке на сервер бинарным протоколом. Все данные что нужно будет выслать просто складываю в массив. В нужный момент переношу все данные из массива в ByteArray, упаковывая в зависимости от типа объекта. И вот все прекрасно работает, кроме одного, невозможно отличить int от Number, если присвоено целое значение.

enepx 15.08.2008 21:25

Цитата:

Сообщение от terbooter (Сообщение 756847)
Хочу полюбопытствовать, а где могла возникнуть такая задача?

9 класс, городская олимпиада по программированию, запросто :taunt:

BlooDHounD 15.08.2008 22:00

MerlinTwi, хм ... а объекты не типизированные?

Tfp 15.08.2008 22:06

ну дак чем то что я написал не подходит?

etc 15.08.2008 23:44

Проще, я думаю, проверять, целое ли число и меньше ли оно диапазона int.MAX_VALUE и записывать соответственно int, с флагом, что это int. В противном случае — Number.

А вообще, при возникновении подобных проблем, стоит призадуматься над правильности такой схемы.


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

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