0

在 ActionScript 3 中,是否有一种简洁的方法来定义一个接受可选布尔参数的函数?如您所知,这是无效的:

public function test(param:Boolean = null):void {
    trace(param);
}

这会触发以下错误:VerifyError: Error #1102: Illegal default value for type Boolean。由于,Boolean是一个原语,我想它不能设置为null. 我发现的唯一解决方法是将参数转换为对象:

public function test(param:Object = null):void {
    trace(Boolean(param));
}

但是,这感觉不是很干净,特别是如果您正在开发库。ASDoc 将生成 API 文档,说明预期参数是 anObject而真正需要的是Boolean.

有更好的方法吗?

4

4 回答 4

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) );
于 2013-03-22T02:12:13.660 回答
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[]

于 2013-03-22T01:50:17.090 回答
0

从上面的好建议和讨论中,我认为,在库场景中,为简单起见,最好的方法仍然是Object使用默认值键入参数,但在 API 文档null中请求 a :Boolean

/**
 * @param param Boolean object or null
 */
public function test(param:Object = null):void {
    trace(Boolean(param));
}

这允许库的用户传递一个布尔值或什么都不传递。感谢大家。

于 2013-04-04T20:09:47.457 回答
0

关于我之前的回答进行了大量讨论,但这是拥有接受三种状态之一的函数的正确方法。我之前的回答试图保留您要求的布尔值的使用,但这不是正确的方法。

创建一个定义三个值的类:

class State
{
    public static const EMPTY:int = -1;
    public static const FALSE:int = 0;
    public static const TRUE:int = 1;
}

您的函数将接受一个int(您的类中三个属性中的每一个的类型State)。它将处理三个可能的值。您可以使用简洁的注释来通知开发人员您对函数期望的值,引用State类。默认值可以是-1aka 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;
    }
}
于 2013-04-07T07:51:22.513 回答