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

car*_*ted 3 d

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

@memoize("expensiveCalc")
int expensiveCalc(string foo){
    ///bar
}
Run Code Online (Sandbox Code Playgroud)

所以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
Run Code Online (Sandbox Code Playgroud)

Ada*_*ppe 5

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

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

  • 我正在学习D而且它一直在变得越来越好:D (2认同)