АС3:объявление “неопределенного” параметра для int, uint или Number

StackOverflow https://stackoverflow.com/questions/840469

Вопрос

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

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 и т.д., но ничего не сработало.Единственный клудж, который я могу придумать навскидку, - это указать какое-нибудь "магическое число" для использования по умолчанию, но это некрасиво.Кто-нибудь знает лучшее решение?

Спасибо!

Это было полезно?

Решение

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, который содержит целочисленное значение и флаг (независимо от того, было ли оно на самом деле инициализировано или нет).Таким образом, вы бы четко просигнализировали, что значение должно быть целым или не представляющий ценности.Однако такой подход может быть немного громоздким.

Другие советы

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

Проблема в том, что 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 */
    }
}

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

if(myUint == new uint){ is undefined, act appropriately; }
function setMyValue (myVar:int = -1):void
{
    if (myVar == -1)
    {
        /* Generate a value for myVar */
    }
    else
    {
        /* Use the supplied value for myVar */
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top