如何将布尔函数参数定义为可选?

时间:2013-03-22 01:49:03

标签: actionscript-3

在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

有更好的方法吗?

4 个答案:

答案 0 :(得分:2)

正如您所说,布尔值不能设置为null值。

因此,您应指定truefalse的默认值。

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
        }
    }

请注意,此解决方案还接受可与truefalse进行比较的对象或基元,例如01[]。< / 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;
}

您的函数将接受intState类中三个属性中每个属性的类型)。它将处理三个可能的值。您可以使用简明的注释来通知开发人员函数期望的值,引用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;
    }
}