我想实现以下逻辑:
function setMyValue (myVar:int = undefined):void
{
if (myVar == undefined)
{
/* Generate a value for myVar */
}
else
{
/* Use the supplied value for myVar */
}
}
因此,如果提供了该值,请使用它。如果不是,则生成它。看起来很简单。
问题是AS3不喜欢这样。“undefined”被强制转换为“0”,因此myVar永远不是未定义的。我尝试过使用NaN、null等变体,但都不起作用。我能随手想到的唯一办法就是提供一些‘魔术数字’作为默认值,但这太丑陋了。有人知道更好的解决方案吗?
谢谢!
发布于 2009-05-08 09:40:40
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
类型。
如果你担心性能--不用担心。使用Number
而不是int
或uint
通常是可以的。
更新:如果您想显式地将参数标记为整型,只需使用额外的标志和确切的类型-这将更加清晰。
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
,它保存整数值和一个标志(无论它是否实际初始化)。这样,您就可以清楚地表示值应该是整型的或无值的。然而,这种方法可能有点笨重。
发布于 2009-05-08 07:45:55
生成的值是常量吗?如果是,为什么不简单地将其设为默认值呢?
的问题是AS3不喜欢这样。“undefined”被强制转换为“0”,因此myVar永远不是未定义的。
是的,因为这是int
的默认初始化值(对于string
和Object
,这将是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 */
}
}
发布于 2010-08-20 11:00:20
我的解决方案就是简单地使用这个
if(myUint == new uint){ is undefined, act appropriately; }
https://stackoverflow.com/questions/840469
复制