0

只是想知道,如果我可以为 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.

也许这里有一些黑客行为?

4

3 回答 3

1

您的问题是defvalue 必须是编译时常量,因此无法将默认值存储到 var 中并将其作为默认值传递。但是这里你真正想要的是知道用户是否在 的def字段中传递了一个额外的参数function,所以你可以检查arguments数组长度,看看是否传递了 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];
    }
}
于 2013-06-04T19:32:44.910 回答
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。

于 2013-06-04T18:00:18.767 回答
0

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

于 2013-06-04T16:53:30.840 回答