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 报一个 issue。我想向 README.md 提供以下修正。当然,我希望了解是否需要进行任何更改。 https://github.com/zackteo/core.cache/commit/e4600ca53a85b080bad55f1fe7576621e28a6fef

但了解在尝试创建 PR 后,我需要通过不同的流程?我之前已经签署了 CA 来修改一些 Clojure 站点的部分,但仍然能够为那个创建 PR。

我尝试登录到https://clojure.atlassian.net/jira/software/c/projects/CCACHE/issues以创建 issue,但我认为我没有访问权限,这是有道理的。是否有正确的途径提出问题https://ask.clojure.org/index.php/contrib-libs,这样别人最终会在 JIRA 中创建 issue?

请遵循此链接汇报问题或请求增强。

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!)])
  ...)
这正是你想要的。你传递一个函数,如果缓存条目需要计算,它将在键(file-path)上被调用。
Sean 还更新了文档,包含一个有 w/lookup-or-miss 的明确部分示例,在 cache/through-cache 的基础上

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