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)))

导致我正在进行的 IO 调用,它代替了 (Thread/sleep 1000) 总是会被评估。这导致一个“缓存”,它返回缓存中的值,但总会触发调用

关闭时附带说明:问题已在评论中回答
作为背景

嗨 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 还在文档中添加了一个显式的部分示例,在第 cache/through-cache 例子之上加入了 w/lookup-or-miss

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