AS3:为int,uint或Number声明"undefined"参数

Wik*_*iup 11 parameters int actionscript function actionscript-3

我想实现以下逻辑:

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

因此,如果提供了值,请使用它.如果没有,请生成它.看起来很简单.

问题是AS3不喜欢这个.'undefined'被强制转换为'0',所以myVar永远不会被定义.我尝试过使用NaN,null等变体,但没有任何效果.我能想到的唯一一个关键是提供一些"魔术数字"作为默认值使用,但那很难看.谁知道更好的解决方案?

谢谢!

dra*_*fly 14

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 */
    }
}
Run Code Online (Sandbox Code Playgroud)

这在技术上更准确,也更稳定.它还允许您在编译时强类型,并且不会像使用时那样导致奇怪的错误Object.

请注意,这不会起作用,int因为其中一个答案表明.int只有数值,并且NaN将得到强制为0.您将需要使用Number的类型.

如果你担心表现 - 不要.使用Number代替intuint一般都可以.


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 */
    }
}
Run Code Online (Sandbox Code Playgroud)

另一种选择是使用附加值定义您自己的类型,例如MaybeInt,它保存整数值和标志(无论它是否实际初始化).这样你就可以清楚地表明价值应该是积分的或没有价值的.但是,这种方法可能有点笨重.