2024 Clojure 状态调查! 中分享您的想法。

欢迎!有关如何运作的更多信息,请参阅 关于 页面。

-1
core.cache
已关闭

最近因 README.md 中的示例而误导。

我做了以下等效操作
(w/lookup-or-miss C3 :b (constantly (do (Thread/sleep 1000) 42)))

而不是

(w/lookup-or-miss C3 :b (fn [& args] (do (Thread/sleep 1000) 42)))

结果是在 (Thread/sleep 1000) 位置的 I/O 调用总是会被评估。这导致了一个总是触发调用的 "缓存",它从缓存中返回值,但总会触发调用

已关闭,备注:问题已在评论中解答
背景信息

嗨 Sean,我想请问如何向 core.cache 提交问题。我想贡献以下修改到 README.md。当然,我也想听听是否有任何修改需要做。 https://github.com/zackteo/core.cache/commit/e4600ca53a85b080bad55f1fe7576621e28a6fef

但在我尝试创建 PR 之后,我意识到我需要经过不同的流程?我之前已签署过 CA 以修改 Clojure 网站的一些内容,但我仍能为那次创建 PR。

我试图登录到 https://clojure.atlassian.net/jira/software/c/projects/CCACHE/issues 以创建一个问题,但我觉得我没有对该部分的访问权限,这很合理。有没有合适的途径提出一个问题 https://ask.clojure.org/index.php/contrib-libs,有人最终会在 JIRA 中创建一个问题?

我是不是应该遵循这个链接来报告问题或请求增强?

1 个回答

0

我不明白您的问题。lookup-or-miss接受一个带有一个参数(键)的函数,在没有找到请求的值时调用该函数。

您能否提供具体的重现案例以及您感知到的错误解释?根据您的示例,我没有看到问题所在。

哦,我想我明白了……这与core.cache无关,而是与您对core/constantly函数的理解有关:它始终评估其参数(因为它是函数),然后返回一个返回预计算值的单一参数函数。

这正是Clojure的工作方式。
我和Sean关于我在做什么进行了讨论

我在一个let绑定中这样处理过,其中s3-path->file-size! 是一个网络调用

```
(let [s3-size (w/lookup-or-miss cache file-path (constantly (s3-path->file-size! file-path))]
;; 做一些事情
)
```

所以我最终意识到我会从缓存中获取file-path的值,但是由于constantly,我会无意识地强制评估s3-path->file-size!
 .
明白这一点是我对评估工作原理的误解。但我想这可能是一个将来也可能有人遇到的错误。
Sean进行了回复

(let [s3-size (w/lookup-or-miss cache file-path s3-path->file-size!)])
  ...
这正是你所需要的。你传递一个函数,如果缓存条目需要被计算,它将在键(文件路径)上调用该函数。
Sean还使用w/lookup-or-miss在cache/through-cache示例之上添加了一个明确的局部示例

https://github.com/clojure/core.cache/commit/803d1c0b060ac0ad14c0cae6e6bcefa8c907199b
...