请在 2024 年 Clojure 调查 中分享您的想法!

欢迎!请参见 关于 页面了解更多有关此方法的信息。

+3
文档
封闭

《assoc!》 和 《conj!》 的文档字符串都说 "返回 coll。",这可能会让人觉得暂时的编辑始终是就地发生的,“coll” 是第一个参数。然而这不是事实,应该始终使用返回的集合。

方法: 将 `conj(image:`, `pop!` 的文档字符串中的 "返回 coll。" 替换为 "返回一个更新的集合。"。

Patch: CLJ-1385-reword-docstrings-on-transient-update-funct-2.patch

审阅者: Alex Miller

带有以下备注关闭: 在 Clojure 1.12.0-beta1 中发布(已更改 "transient" 文档字符串)

15 答案

0

评论者:alexmiller

在修改暂态集合时,必须使用像 assoc! 这样的函数返回的集合。这里的 ! 表示其破坏性本质。transients 页面(https://clojure.org/transients)对调用模式描述得非常明确:"您必须在下一个调用中捕获并使用返回值。"

我不同意我们应该引导程序员远离使用像 assoc! 这样的函数--暂态用作性能优化,在循环中使用 assoc! 或 conj! 往往是最佳版本。然而,我认为使文档字符串更加明确是有帮助的。

0

评论者:gfredericks

Alex,我认为你可能看错了工单——原始发帖者建议引导使用 assoc! 的返回值,而不是完全避免使用 assoc!

并且,文档字符串不仅仅是含糊不清,在原始发帖者指出的情况下,实际上是错误的。《code>conj! 和 assoc 在数组映射转换为哈希映射的点并不返回 coll,而且根据我的理解,它们在其他情况下返回的是实现细节。

0

评论者:alexmiller

@Gary,你说得对,我确实误解了那部分。

assocconj 明确表示“返回一个新集合”,而 assoc!conj 表示“返回 coll”。我理解为“返回修改后的集合”,不考虑是相同的实例,但我也可以像你那样理解。

说“返回更新后的集合”能传达正确的意思吗?用“集合”而不是“coll”移除了与变量的具体关联,“更新”更强烈地暗示了应使用返回值。

0

评论者:pyrtsa

@Alex,在我看来这个更新听起来是正确的。

0

评论者:gfredericks

我认为这样就更好了。谢谢 Alex。我很乐意提交一个补丁,但我想补丁对这个类型的变化来说可能太重了?

0

评论者:jafingerhut

对于这种类型的更改,过去确实是通过补丁实现的,如果更改是在文档字符串中而不是在 clojure.org 网页上。

0

评论者:alexmiller

是的,有需要的补丁。

0

评论者:gfredericks

很高兴提出了这个问题。

附上了补丁,它也更新了 pop! 的文档字符串,它也存在相同的问题,尽管按照我的了解,pop! 总是返回相同的集合,但这似乎不是合同的一部分。

0

评论者:jafingerhut

由于今天早期提交了一些更改,2014年4月6日的补丁文件CLJ-1385-reword-docstrings-on-transient-update-funct.patch已不再适用于最新的 Clojure 主版本,我怀疑应该可以简单修改补丁以使其正确应用,因为这些改动是文档字符串的更改,但也可能主分支上已经有了文档字符串的更改。

0

评论者:gfredericks

附上了一个新的补丁。

0

评论者:richhickey

我认为还需要更清楚一些,因为我们希望让人们知道原始的 coll 可能已经被更改和返回,并且必须使用返回值进行后续调用。我认为来自 transients 页面的某些语言应该包含在这些文档字符串中。

0

评论者:jafingerhut

是否能说,在操作完成后,传递给 pop! conj(image: assoc) 等的集合具有未定义的内容,而只有返回值具有定义的内容?

这样的强烈措辞可能会引起人们的注意。

0
by

评论者:alexmiller

我在处理这件事。

0
by

评论者:alexmiller

尚未完成,我(仍然)负责这个

0
by
参考: https://clojure.atlassian.net/browse/CLJ-1385 (由 alex+import 报告)
...