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

Actionscript 3 函数参数的默认值,保证唯一,actionscript-3,flash,Actionscript 3,Flash,我只是想知道,我是否可以为ActionScript3中的函数提供默认参数,用户永远无法将该参数传递给该函数。情况就是这样: public function getAttr (obj:Object, key:String, def:* = DEFAULT_VALUE):* { if (!obj.hasOwnProperty(key)) { if (def === DEFAULT_VALUE) { throw ReferenceError('Attri

我只是想知道,我是否可以为ActionScript3中的函数提供默认参数,用户永远无法将该参数传递给该函数。情况就是这样:

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、未定义、Number、Boolean或String作为默认值,因为从逻辑上讲,用户可以使用这些值中的任何一个。我需要一些真正独特的东西。例如,在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.

这里可能有黑客?

传输null,并检查null。毕竟,
null
是一个默认值,实际上什么都不是。如果您需要提供一个参数并使其有效,请使用
null
作为默认值,这样,如果要提供某个参数,它就不会为null,因此是有效的。

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.

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

public function getAttr (obj:Object, key:String, def:* = null):* {
    if (!obj.hasOwnProperty(key)) {
        if (arguments.length==2) { // no default value passed to the function
            throw new ReferenceError('Attribute not found: ' + key);
        } else {
            return def;
        }
    } else {
        return obj[key];
    }
}

除了Vesper所说的,如果真的归结到它,你可以制作两个不同版本的函数,用两个不同的函数符号来半实现它。例如,funcLite()和func(),但正如Vesper所说,你在AS3中所要求的不会有太多的运气。这是语言中更大的缺点和刺激的一部分。不,我个人不认为,这个案例是动作脚本刺激的迹象。动作脚本是编译语言,所以使用编译时间常量的限制似乎是合法的。但是的,一般来说,动作脚本并不完美:)在这种情况下,cons_blocker是必需的参数,我的情况下,我需要检查用户是否提供了可选参数。帕特里克的回答很完美,但还是要感谢你。:)