AS3: объявление «неопределенного» параметра для int, uint или Number - PullRequest
11 голосов
/ 08 мая 2009

Я бы хотел реализовать следующую логику:

function setMyValue (myVar:int = undefined):void
{
    if (myVar == undefined)
    {
        /* Generate a value for myVar */
    }
    else
    {
        /* Use the supplied value for myVar */
    }
}

Так что, если указано значение, используйте его. Если нет, сгенерируйте его. Кажется достаточно простым.

Проблема в том, что AS3 это не нравится. «undefined» приводится к «0», поэтому myVar никогда не определяется. Я пробовал варианты с NaN, null и т. Д., Но ничего не получалось. Единственный недостаток, который я могу придумать, заключается в том, чтобы предоставить какое-то «магическое число» для использования по умолчанию, но это ужасно. Кто-нибудь знает лучшее решение?

Спасибо!

Ответы [ 4 ]

14 голосов
/ 08 мая 2009

UPD (из моего комментария): Конечно, не рекомендуется выбирать какое-то магическое число для обозначения отсутствия значения, если только вы не можете быть полностью уверены, что это магическое число не появится в результате некоторых арифметика (что в целом верно). Таким образом, лучший подход здесь - это использовать более широкий тип, чем int (например, Number), или передать некоторый флаг (Boolean значение) для функции, а также int, чтобы указать фактическое отсутствие значения. Выбор должен зависеть от того, хотите ли вы подчеркнуть важность того факта, что переданное значение является интегральным.


Если вы чувствуете себя комфортно с расширением типа аргумента, тогда вы должны использовать NaN и сделать это:

function setMyValue (myVar : Number = NaN) : void
{
    if ( isNaN(myVar) )
    {
        /* Generate a value for myVar */
    }
    else
    {
        /* Use the supplied value for myVar */
    }
}

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

Обратите внимание, что это не будет работать с int, как предполагает один из ответов. int имеет только числовые значения, а NaN будет приведен к 0. Вам нужно будет использовать Number тип.

Если вы беспокоитесь о производительности - не беспокойтесь. Использование Number вместо int или uint - это нормально.


UPD: Если вы хотите явно пометить, что аргумент должен быть целым, просто используйте дополнительный флаг и точный тип - это будет намного понятнее.

function setMyValue (isIntValueSupplied : Boolean = false, intValue : int = 0) : void
{
    if ( isIntValueSupplied )
    {
        /* Generate or use a default value of intValue */
    }
    else
    {
        /* Use the supplied value for intValue */
    }
}

Другой вариант - определить свой собственный тип с дополнительным значением, например, MaybeInt, который содержит целочисленное значение и флаг (был ли он фактически инициализирован или нет). Таким образом, вы бы четко указали, что значение должно быть целым или без значения . Однако такой подход может быть немного громоздким.

2 голосов
/ 20 августа 2010

Мое решение было просто использовать это

if(myUint == new uint){ is undefined, act appropriately; }
2 голосов
/ 08 мая 2009

Является ли сгенерированное значение константой? Если это так, то почему бы просто не использовать это в качестве значения по умолчанию?

Проблема в том, что AS3 это не нравится. «undefined» приводится к «0», поэтому myVar никогда не определяется.

Да, потому что это значение инициализации по умолчанию для int (для string и Object это будет null).

Другой вариант - свободно набирать параметр как Object или оставить его неуказанным (с помощью *), а затем типизировать его до int, если он не null.

function setMyValue (myVar:Object = null):void
{
    if (myVar == null)
    {
        /* Generate a value for myVar */
    }
    else
    {
        int value = myVar as int;
        /* Use the supplied value for myVar */
    }
}
0 голосов
/ 17 ноября 2010
function setMyValue (myVar:int = -1):void
{
    if (myVar == -1)
    {
        /* Generate a value for myVar */
    }
    else
    {
        /* Use the supplied value for myVar */
    }
}
...