AS3: объявление параметра "undefined" для int, uint или Number

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

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

Спасибо!

Ответ 1

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

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

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

Да, потому что это значение инициализации по умолчанию для 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 */
    }
}

Ответ 3

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

if(myUint == new uint){ is undefined, act appropriately; }

Ответ 4

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