只是想知道,如果我可以在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.
也许有人在这里破解?
答案 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。