11

我想实现以下逻辑:

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

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

问题是 AS3 不喜欢这个。“未定义”被强制转换为“0”,因此 myVar 永远不会未定义。我尝试了 NaN、null 等的变体,但没有任何效果。我能想到的唯一办法是提供一些“幻数”作为默认值,但这很难看。有人知道更好的解决方案吗?

谢谢!

4

4 回答 4

14

UPD(来自我的评论):选择一些幻数来表示值缺失当然​​不是一个好习惯,除非您可以完全确定这个幻数不会作为某些算术的结果出现(这通常是正确的)。因此,这里最好的方法是使用比int(eg Number) 更宽的类型,或者将一些标志 ( Booleanvalue) 传递给函数,以及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只有数值,并且会被强制为 0。您需要使用type .NaNNumber

如果您担心性能 - 不要担心。使用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 */
    }
}

另一种选择是使用附加值定义您自己的类型,例如MaybeInt,它包含整数值和一个标志(无论它是否实际初始化)。这样你就会清楚地表明 value 应该是 integer 或no-value。但是,这种方法可能有点笨重。

于 2009-05-08T17:40:40.057 回答
2

生成的值是 const 吗?如果是,为什么不简单地将其作为默认值?

问题是 AS3 不喜欢这个。“未定义”被强制转换为“0”,因此 myVar 永远不会未定义。

是的,因为这是int(for stringand Objectthis'd be null) 的默认初始化值。

另一种选择是将参数松散地键入为 anObject或保持未指定(通过使用 a ), 如果它不是,则*稍后将其类型转换为。intnull

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 */
    }
}
于 2009-05-08T15:45:55.093 回答
2

我的解决方案是简单地使用它

if(myUint == new uint){ is undefined, act appropriately; }
于 2010-08-20T11:00:19.500 回答
0
function setMyValue (myVar:int = -1):void
{
    if (myVar == -1)
    {
        /* Generate a value for myVar */
    }
    else
    {
        /* Use the supplied value for myVar */
    }
}
于 2010-11-17T10:06:03.067 回答