Domanda

Vorrei implementare la seguente logica:

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

Quindi, se viene fornito il valore, usalo. Altrimenti, generalo. Sembra abbastanza semplice.

Il problema è che ad AS3 non piace questo. 'undefined' viene forzato in '0', quindi myVar non viene mai definito. Ho provato le varianti con NaN, null, ecc., Ma nulla ha funzionato. L'unico kludge che mi viene in mente è di fornire un "numero magico" da usare come predefinito, ma è brutto. Qualcuno conosce una soluzione migliore?

Grazie!

È stato utile?

Soluzione

UPD (dal mio commento): non è certamente una buona pratica scegliere un numero magico per indicare l'assenza di valore, a meno che tu non possa essere completamente sicuro che questo numero magico non apparirà come risultato di alcuni aritmetici (che generalmente è vero). Quindi l'approccio migliore qui è usare un tipo più ampio di int (ad es. Number ) o passare un flag ( Boolean ) per funzionare , nonché int , per indicare l'assenza di valore effettivo. La scelta dovrebbe dipendere dal fatto che si desideri sottolineare l'importanza del fatto che il valore passato sia integrale.


Se ti senti a tuo agio con l'espansione del tipo di argomento, allora dovresti usare NaN e fare questo:

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

Ciò è sia tecnicamente più accurato che anche più stabile. Ti consentirà anche di digitare con forza in fase di compilazione e non causerebbe strani bug come nel caso dell'uso di Object .

Nota che questo non funzionerà con int come suggerisce una delle risposte. int ha solo valori numerici e NaN sarà costretto a 0. Dovrai usare il tipo Number .

Se sei preoccupato per le prestazioni, non esserlo. L'uso di Number invece di int o uint è generalmente OK.


UPD: Se vuoi contrassegnare esplicitamente quell'argomento dovrebbe essere integrale, usa solo flag aggiuntivo e tipo esatto - sarebbe molto più chiaro.

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 */
    }
}

Un'altra opzione è quella di definire il proprio tipo con un valore aggiuntivo, ad es. MaybeInt , che contiene un valore intero e un flag (indipendentemente dal fatto che sia stato inizializzato o meno). In questo modo segnaleresti chiaramente che il valore dovrebbe essere integrale o nessun valore . Tuttavia, questo approccio può essere un po 'ingombrante.

Altri suggerimenti

Il valore generato è una const? Se lo è, perché non semplicemente avere questo come valore predefinito?

  

Il problema è che ad AS3 non piace questo. 'undefined' viene forzato in '0', quindi myVar non è mai indefinito.

Sì, perché questo è il valore di inizializzazione predefinito per int (per string e Object sarebbe null ).

L'altra opzione è quella di digitare liberamente il parametro come Object o mantenerlo non specificato (utilizzando un * ) e successivamente inserirlo in int se non è 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 */
    }
}

La mia soluzione era semplicemente usare questo

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 */
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top