在ActionScript 3中,是否有一种干净的方法来定义一个接受可选布尔参数的函数?如您所知,这是无效的:
public function test(param:Boolean = null):void {
trace(param);
}
这会触发以下错误: VerifyError:错误#1102:类型为Boolean 的非法默认值。由于Boolean
是一个原语,我想有意义的是它不能设置为null
。我找到的唯一解决方法是将参数强制转换为对象:
public function test(param:Object = null):void {
trace(Boolean(param));
}
然而,这并不是很干净,特别是如果您正在开发库。 ASDoc将生成API文档,其中预期参数为Object
,而实际需要的是Boolean
。
有更好的方法吗?
答案 0 :(得分:2)
正如您所说,布尔值不能设置为null
值。
因此,您应指定true
或false
的默认值。
public function test(param:Boolean = false):void {
trace(param);
}
但是因为您需要第三种情况,其中没有设置任何东西,一个选项可能是接受任何Object,但如果它不是null而不是布尔值则抛出异常:
public function test(param:* = null):void
{
if (param != null)
{
if ((param == true) || (param == false))
{
trace(Boolean(param).toString());
}
else
{
throw new CustomError("param should be a boolean");
}
}
else
{
// Do nothing
}
}
请注意,此解决方案还接受可与true
或false
进行比较的对象或基元,例如0
,1
或[]
。< / p>
答案 1 :(得分:2)
当你说optional
时,我认为你的意思是,如果没有提供超值,那么与你的default
值为真或假相比,会发生不同的事情。
您可以创建自己的对象来处理所需的三种状态,并使用如下类来维护代码可读性:
public class Condition
{
private var _value:* = null;
public function Condition(initial:* = null)
{
value = initial;
}
public function set value(n:*):void
{
if(_value === null || _value === false || _value === true)
{
_value = n;
}
}
public function get value():*{ return _value; }
}
然后你的功能可能是:
function test(param:Condition = null):void
{
if(param && param.value != null)
{
trace(param.value);
}
}
test( new Condition() );
test( new Condition(true) );
答案 2 :(得分:0)
根据上面的好建议和讨论,我认为,在库方案中,为了简单起见,最好的方法仍然是将参数键入Object
,默认值为null
但要求API文档中的Boolean
:
/**
* @param param Boolean object or null
*/
public function test(param:Object = null):void {
trace(Boolean(param));
}
这允许库的用户传递布尔值或者根本不传递任何值。谢谢大家。
答案 3 :(得分:0)
我之前的答案有一个很多的讨论,但是是正确的方法有一个接受三种状态之一的函数。我之前的回答试图像你要求的那样保留使用布尔值,但这不是正确的方法。
创建一个定义三个值的类:
class State
{
public static const EMPTY:int = -1;
public static const FALSE:int = 0;
public static const TRUE:int = 1;
}
您的函数将接受int
(State
类中三个属性中每个属性的类型)。它将处理三个可能的值。您可以使用简明的注释来通知开发人员函数期望的值,引用State
类。默认值可以是-1
又名State.EMPTY
。
/**
* Function description.
* @param state One of three states, defined by State.
*/
function test(state:int = -1):void
{
switch(state)
{
case State.EMPTY:
// No value given.
break;
case State.TRUE:
// True.
//
break;
case State.FALSE:
// False.
//
break;
default:
throw new ArgumentError("Unsupported value for test()");
break;
}
}