球拍中的make-hash make-weak-hash有啥区别?
Posted
技术标签:
【中文标题】球拍中的make-hash make-weak-hash有啥区别?【英文标题】:What is the difference between make-hash make-weak-hash in racket?球拍中的make-hash make-weak-hash有什么区别? 【发布时间】:2016-12-11 00:37:53 【问题描述】:在寻找记忆功能时发现了这个:
#lang scheme
(define (memo f)
(define mh (make-hash))
(lambda p
(hash-ref mh p (lambda ()
(hash-set! mh p (apply f p))
(hash-ref mh p)))))
(define-syntax-rule (defmemo (id . p) . body)
(define id (memo (lambda p . body))))
(provide defmemo)
如此处所示:Writing an auto-memoizer in Scheme. Help with macro and a wrapper
但是在文档中还有:make-weak-hash 和 make-immutable-hash。哪个哈希函数更适合记忆?
【问题讨论】:
【参考方案1】:好问题。
我会说坚持make-hash
是你最好的选择。其他选项用于不同的目的。
make-immutable-hash
用于制作,嗯,你猜对了,不可变哈希表。它创建的哈希表与您使用hash
创建的哈希表相同。当然,表中的项目仍然可以是可变的,例如如果您在其中放置了一个可变结构。只是表本身是不可变的。
make-hash
用于制作可变哈希表。这可能是你想要的,因为你正在改变你的记忆表。
make-weak-hash
实际上完全不同。具体来说,它存储指向表中项目的“弱”指针。也就是说,就垃圾收集器而言,它不算作指针。因此,如果您使用它们,您的物品最终可能会被收集。 (这并不意味着您会遇到段错误,您只是可能会丢失数据。)因此,除非您知道您特别需要此行为,否则您通常不需要此表。
【讨论】:
make-weak-hash
会在哪里使用?
任何时候你不希望 GC 只因为它在你的表中而保留你的对象。例如,如果你正在实现一个终结器,你可能想要使用 make-weak-hash。以上是关于球拍中的make-hash make-weak-hash有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章