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) 的 IO 调用始终被评估。这导致了一个始终触发调用的“缓存”,它会返回缓存中的值

已关闭,并附带以下说明:问题在评论中得到解答
背景

嗨 Sean,我想问一下如何为 core.cache 创建问题。我想要为 README.md 添加以下修正。当然,我很乐意听听是否需要做出任何更改。《a href="https://github.com/zackteo/core.cache/commit/e4600ca53a85b080bad55f1fe7576621e28a6fef" rel="nofollow" target="_blank">https://github.com/zackteo/core.cache/commit/e4600ca53a85b080bad55f1fe7576621e28a6fef

但在我尝试创建 PR 之后,我了解到我需要通过不同的流程?我以前签署了 CA,用于修正 Clojure 网站的一些部分,但仍然能够为那个创建 PR。

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

我是按照这个https://clojure.org/community/contributing#_reporting_problems_and_requesting_enhancements?做的吗?

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的值,但后来无意中强制计算了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
...