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

 披着狼皮的卷毛羊万_784 发布于 2023-02-12 19:38

我真正想做的是缓存/记忆某些函数参数和结果.我理解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添加信息,它们不会更改或创建代码.

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

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

    2023-02-12 19:40 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有