是否可以使用用户定义的属性在运行时获取值?

时间:2013-12-04 17:53:20

标签: d

我真正想做的是缓存/记忆某些函数参数和结果。我理解d中有用户定义的属性,但似乎没有办法用它来获取运行时值。我错了吗?我可以使用其他类似的设计模式来获得类似的结果吗?

@memoize("expensiveCalc")
int expensiveCalc(string foo){
    ///bar
}

所以memoize实际上是一个被调用的函数。但是,它利用我的参数值快速哈希参数并调用实际函数 与此类似:

def memoize(iden, time = 0, stale=False, timeout=30):
    def memoize_fn(fn):

        def new_fn(*a, **kw):

            #if the keyword param _update == True, the cache will be
            #overwritten no matter what
            update = kw.pop('_update', False)
            key = make_key(iden, *a, **kw)
            res = None if update else memoizecache.get(key)
            if res is None:
                        # okay now go and actually calculate it
                    res = fn(*a, **kw)
                    memoizecache.set(key, res, time=time)



            return res

        new_fn.memoized_fn = fn
        return new_fn
    return memoize_fn

1 个答案:

答案 0 :(得分:5)

对于您要做的事情,您需要一个包装模板而不是UDA。 Phobos实际上有一个用于记忆:http://dlang.org/phobos/std_functional.html#memoize

D中的UDA用于向函数(或其他符号,类型和变量)添加信息,但它们实际上并未对其进行修改。模式是让一些其他代码用反射读取所有名称,查看UDA,并以这种方式生成新代码。如果要从UDA获取运行时值,可以编写一个使用编译时反射读取它的函数,然后返回该值。在运行时调用该函数可以在那里调用UDA。如果您想了解更多信息,我可以写一下,但我认为std.functional.memoize会在这里做你想做的事。请记住,D中的UDA添加信息,它们不会更改或创建代码。