我真正想做的是缓存/记忆某些函数参数和结果.我理解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
Adam D. Rupp.. 5
对于你想要做的事情,你需要一个包装模板而不是UDA.Phobos实际上有一个用于记忆:http://dlang.org/phobos/std_functional.html#memoize
D中的UDA用于向函数(或其他符号,类型和变量)添加信息,但它们实际上并未对其进行修改.模式是让一些其他代码用反射读取所有名称,查看UDA,并以这种方式生成新代码.如果要从UDA获取运行时值,可以编写一个使用编译时反射读取它的函数,然后返回该值.在运行时调用该函数会在那里提供UDA.如果您想了解更多信息,我可以写一下,但我认为std.functional.memoize会在这里做你想做的事.请记住,D中的UDA添加信息,它们不会更改或创建代码.
对于你想要做的事情,你需要一个包装模板而不是UDA.Phobos实际上有一个用于记忆:http://dlang.org/phobos/std_functional.html#memoize
D中的UDA用于向函数(或其他符号,类型和变量)添加信息,但它们实际上并未对其进行修改.模式是让一些其他代码用反射读取所有名称,查看UDA,并以这种方式生成新代码.如果要从UDA获取运行时值,可以编写一个使用编译时反射读取它的函数,然后返回该值.在运行时调用该函数会在那里提供UDA.如果您想了解更多信息,我可以写一下,但我认为std.functional.memoize会在这里做你想做的事.请记住,D中的UDA添加信息,它们不会更改或创建代码.