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

欢迎!请参阅关于页面了解更多关于这里是如何工作的信息。

+3
文档
关闭

关于 assoc!conj! 的文档字符串说“返回 coll.”,这可能会暗示临时的编辑(总是)在原地发生,其中 coll 是第一个参数。然而,情况并非如此,并且返回的集合应该始终是那个被使用的集合。

方法:conj(image: assoc pop! 的文档字符串中将“返回 coll.”替换为“返回一个更新后的集合”。

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

审核: Alex Miller

留言关闭: 在 Clojure 1.12.0-beta1 中发布(更改了 'transient' 文档字符串)

15 个答案

0

由 alexmiller 发布的评论:

在修改临时集合时,必须使用如 assoc! 之类的函数返回的集合。这里的 ! 标识其破坏性。临时页面(https://clojure.org/transients)描述了调用模式相当明确:“您必须在下一个调用中捕获并使用返回值。”

我不认为我们应该引导程序员远离使用 assoc! 等函数 - 临时是作为性能优化使用的,在循环中使用 assoc! 或 conj! 通常是这个操作的最快版本。然而,我认为使文档字符串更加明确是有帮助的。

0

评论由:gfredericks 添加

Alex,我想你可能误解了工单 -- 原帖作者建议引导使用 assoc! 的返回值,而不是完全避免使用 assoc!

文档字符串不仅不清楚,而且在原帖作者指出的具体情况下还实际上是不正确的。当数组映射转换到哈希映射时,conj!assoc 并不返回 coll,它们在其他情况下返回的是应该被视为实现细节,据我理解。

0

由 alexmiller 发布的评论:

@Gary - 你是对的,我确实误会了这一点。

assocconj 都明确说明 "返回一个新的集合",而对于 assoc!conj!,它们说 "返回 coll。" 我将其解读为 "返回修改后的集合",不考虑它是相同的实例,但我也可以按照你的方式理解。

说 "返回更新后的集合。" 能传达正确的意思吗?使用 "集合" 而不是 "coll" 解除了对变量的具体关联,而 "更新" 更明确地表明应该使用返回值。

0

评论由:pyrtsa 添加

@Alex,FWIW,我认为这个更新听起来是正确的。

0

评论由:gfredericks 添加

是的,我认为这是更好的做法。谢谢你,Alex。我很乐意为此提交一个补丁,但我假设这样的更改补丁太重了?

0

评论由:jafingerhut 添加

如果这种更改是在文档字符串中而不是在 clojure.org 网页上,那么补丁正是过去做过的事情。

0

由 alexmiller 发布的评论:

是的,需要补丁。

0

评论由:gfredericks 添加

很高兴我提问了。

附上的补丁同时也更新了引起了相同问题的 pop! 的文档字符串,尽管可以说这并不重要,因为据我所知,pop! 总是返回相同的集合(但这我不认为这是合约的一部分)。

0

评论由:jafingerhut 添加

由于今天早些时候提交的一些更改,补丁 CLJ-1385-reword-docstrings-on-transient-update-funct.patch 早已不再适用于最新的 Clojure master 版本,因为它是对文档字符串的更改,所以应该很容易更新补丁以干净地应用,但也可能已经将文档字符串更改提交到了 master 版本中。

0

评论由:gfredericks 添加

已附加新的补丁。

0

评论人:richhickey

我认为这还可以更清晰一些,因为我们要让人们知道原来的集合可能已被更改并返回,并且必须使用返回值进行后续调用。我认为有关_transient 页的一些语言应该加入这些文档字符串中。

0

评论由:jafingerhut 添加

能否这样说:在操作完成后,传入 pop! conj(image: assoc) 等函数的集合的内容将是未定义的,而只有返回值的内容是已定义的?

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

0

由 alexmiller 发布的评论:

我在处理这个。

0

由 alexmiller 发布的评论:

不完整且我(仍然)是这个

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