我想实现以下逻辑:

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

因此,如果值被提供时,使用它。如果没有,生成它。似乎很简单。

问题是,AS3不喜欢此。 “未定义”被裹挟到“0”,所以myVar的从来都不是不确定的。我试过的变化与南,空,等等,但没有奏效。我能想到随便的唯一杂牌是提供一些“幻数”作为默认使用,但是这是丑陋的。任何人都知道一个更好的解决方案?

谢谢!

有帮助吗?

解决方案

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类型。

如果你担心性能 - 不要。使用,而不是Numberint 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,持有整数值和一个标志(它是否实际上是初始化或没有)。这样,你会清楚的信号,该值应该是整体或没有值的。然而,这种方法可能会有点笨重。

其他提示

时所产生的值一个const?如果是这样,为什么不干脆都以此为默认值?

  

问题是,AS3不喜欢此。 “未定义”被强迫“0”,所以myVar的是从未未定义。

是的,因为,这是对int默认的初始化值(stringObject this'd是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 */
    }
}

我的解决办法是简单地使用此

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 */
    }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top