Pregunta

Me gustaría implementar la siguiente lógica:

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

Entonces, si se proporciona el valor, úselo. Si no, generarlo. Parece bastante simple.

El problema es que a AS3 no le gusta esto. 'undefined' se convierte en '0', por lo que myVar nunca está indefinido. He intentado variaciones con NaN, nulo, etc., pero nada ha funcionado. El único error que se me ocurre es proporcionar un 'número mágico' para usar como predeterminado, pero eso es feo. ¿Alguien sabe una mejor solución?

¡Gracias!

¿Fue útil?

Solución

UPD (de mi comentario): Ciertamente no es una buena práctica elegir algún número mágico para indicar la ausencia de valor, a menos que pueda estar completamente seguro de que este número mágico no aparecerá como resultado de algunas aritméticas (que generalmente es verdad). Entonces, el mejor enfoque aquí es usar un tipo más amplio que int (por ejemplo, Number ), o pasar alguna bandera (valor Boolean ) para funcionar , así como int , para indicar la ausencia de valor real. La elección debe depender de si desea enfatizar la importancia del hecho de que el valor pasado es integral.


Si se siente cómodo expandiendo el tipo de argumento, entonces debe usar NaN y hacer esto:

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

Eso es más técnicamente preciso y también es más estable. También le permitirá escribir fuertemente en tiempo de compilación y no causará errores extraños como en el caso de usar Object .

Tenga en cuenta que esto no funcionará con int como sugiere una de las respuestas. int tiene valores numéricos solo y NaN se convertirá en 0. Deberá usar el tipo Number .

Si te preocupa el rendimiento, no lo estés. Usar Number en lugar de int o uint generalmente está bien.


UPD: Si desea marcar explícitamente que el argumento debe ser integral, simplemente use una marca adicional y un tipo exacto, sería mucho más claro.

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

Otra opción es definir su propio tipo con valor adicional, p. MaybeInt , que contiene un valor entero y una marca (ya sea que se haya inicializado o no). De esa manera, indicaría claramente que el valor debe ser integral o sin valor . Sin embargo, este enfoque puede ser un poco voluminoso.

Otros consejos

¿El valor generado es una constante? Si es así, ¿por qué no simplemente tener esto como valor predeterminado?

  

El problema es que a AS3 no le gusta esto. 'undefined' se convierte en '0', por lo que myVar nunca está indefinido.

Sí, porque este es el valor de inicialización predeterminado para int (para string y Object esto sería nulo ).

La otra opción es escribir libremente el parámetro como un Object o mantenerlo sin especificar (usando un * ) y luego escribirlo en int si no es nulo .

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

Mi solución fue simplemente usar esto

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 */
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top