函数参数的默认值,保证是唯一的

时间:2013-06-04 16:48:57

标签: actionscript-3 flash

只是想知道,如果我可以在ActionScript 3中为函数提供默认参数,那么用户永远不能将其传递给函数。情况就是这样:

public function getAttr (obj:Object, key:String, def:* = DEFAULT_VALUE):* {
    if (!obj.hasOwnProperty(key)) {
        if (def === DEFAULT_VALUE) {
            throw ReferenceError('Attribute not found: ' + key);
        } else {
            return def;
        }
    } else {
        return obj[key];
    }
}

我不能在这里使用null,undefined,Number,Boolean或String中的任何一个作为DEFAULT_VALUE,因为从逻辑上讲,用户可以使用任何这些值。我需要一些非常独特的东西。例如,在python中,我可以这样做:

_DEFAULT_VALUE = object()
def get_attr(obj, key, d=_DEFAULT_VALUE):
    if not hasattr(obj, key):
        if d is DEFAULT_VALUE:
            raise KeyError('Attribute not found: {}'.format(key))
        else:
            return d
    else:
        return obj[d]

但是在ActionScript 3中,这种方法会产生错误:

Error code: 1047: Parameter initializer unknown or is not a compile-time constant.

也许有人在这里破解?

3 个答案:

答案 0 :(得分:1)

这里的问题是def值必须是编译时常量,因此无法将默认值存储到var中并将其作为默认值传递。 但您真正想要的是知道用户是否已将额外参数传递到def的{​​{1}}字段,因此您可以检查function数组长度并查看是否存在传递了2或3个参数。

arguments

答案 1 :(得分:0)

传输null,并检查null。毕竟,null是默认值,实际上什么都没有,如果您需要提供参数并且有效,请使用null作为默认值,以便在提供某些内容时,它不会为null ,因此有效。

答案 2 :(得分:0)

Vesper的回答似乎对你的情况是正确的。但是,我对单身人士使用了类似的方法:

class Singleton
{
    private var k_CONS_BLOCKER:Object = {};

    public Singleton(cons_blocker:Object)
    {
        if(cons_blocker!=k_CONS_BLOCKER)
        {
            throw new Error("Use static getter to get the object");
        }
    }

    public function getObject():Singleton
    {
        return obj;//you can of course create it now or do some other logic... 
    }
}

我知道答案与问题没有直接关系,但我认为这个想法一般可以解决这个问题。

HTH。