в Actionscript, как определить, является ли тип числа, если Number или int или uint? - PullRequest
2 голосов
/ 19 апреля 2010
var n:Number = 1;
trace("n is Number:" + (n is Number)); //true
trace("n is int:" + (n is int)); //true
trace("n is uint:" + (n is uint)); //true

var m:Number = 1;
trace("m is Number:" + (m is Number)); //true
trace("m is int:" + (m is int)); //true
trace("m is uint:" + (m is uint)); //true

Они все правда! в Actionscript, как определить, является ли тип числа, если Number или int или uint?

Ответы [ 3 ]

3 голосов
/ 23 апреля 2010

Путаница здесь проистекает из своеобразной тонкости того, как AS3 обрабатывает типы и числа. Оператор is проверяет наследование классов, но int и uint на самом деле не являются классами. (Вот почему они не получают заглавных букв - потому что у них нет определения класса.) Они больше похожи на ассоциации типов, которые при правильном использовании могут принести вам определенные удобства и улучшения производительности. Но для целей наследования число есть число есть число.

На практике это означает, что если вы создаете переменную, например, типа uint, то Flash будет хранить это значение внутри себя в 32-битном формате без знака (а не в 64-битном формате, используемом для Number). ). И если вы измените значение этой переменной, оно останется в том же формате, поэтому ограничения на uint будут применены:

var a:uint = 0;
a--;
trace(a); // 4294967295 - it wrapped around

Но на самом деле ссылка на ваш номер набирается как uint, а не само число. Если вы сделаете новую нетипизированную ссылку, это будет очевидно:

var a:uint = 0;
var b:* = a;
b--
trace(b); // -1

Итак, чтобы вернуться к вашей проблеме, как вы должны реализовать свой буферный писатель? Из-за врожденной тонкости в том, как Flash обрабатывает эти типы, я не думаю, что есть абсолютно правильный ответ. Один из подходов состоит в том, чтобы использовать uint или int, если данные соответствуют ограничениям для этих типов, и использовать Number в противном случае. Это сохранит память и сохранит точность. Но отношение ко всем числам как Number также кажется мне оправданным подходом. Я думаю, это зависит от того, что вы планируете делать с буфером.

2 голосов
/ 21 апреля 2010

Это легко. Я добавил дополнительные переменные, чтобы показать, как это работает. Надеюсь это поможет.

var n:Number = 1;
var v:Number = 1.1;
var r:Number = -1;

trace(getQualifiedClassName (n));//output shows 'int'
trace(getQualifiedClassName (v));//output shows 'Number'
trace(getQualifiedClassName (r));//output shows 'int'
0 голосов
/ 19 апреля 2010

хорошо, чтобы проверить, является ли число целым числом, вы можете попробовать:

var epsilon: Number = 1E-6;var n: Number;if (Math.abs (n-int (n))

если число отрицательное, то оно должно быть целым числом и не может быть uint. Однако, если число отрицательное и <-2 147 483 648, тогда оно должнобыть числом, а не int или uint. Если оно положительно и> 4 294 967 295, то это тоже должно быть число. Если оно положительно и находится между 2 147 483 648 и 4 294 967 295, это может быть либоили Число. Если оно положительное и <2 147 483 648, это может быть int или uint, или Number. </p>

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...