欢迎!请查看 关于 页面以了解此功能的工作方式。
assoc! 和 conj! 的文档字符串都提到 "返回 coll.",可能暗示了瞬态编辑总是就地发生,其中 coll 是第一个参数。但实际上并非如此,应该始终使用返回的集合。
assoc!
conj!
coll
方法: 在 conj(image: 、assoc、pop! 的文档字符串中,将 "返回 coll." 替换为 "返回一个更新后的集合"。
conj(image:
assoc
pop!
补丁: CLJ-1385-reword-docstrings-on-transient-update-funct-2.patch
审核: Alex Miller
评论者:alexmiller
在修改瞬态集合时,必须使用类似 assoc! 的函数返回的集合。这里的 ! 表示其破坏性。瞬态页面 (https://clojure.org/transients) 对调用模式的描述非常明确:"您必须在下一个调用中捕获并使用返回值。"
我不同意我们应该引导程序员远离使用像 assoc! 这样的函数 -- 瞬态是为了性能优化而使用的,而在循环中使用 assoc! 或 conj! 通常是最快的版本。然而,我认为使文档字符串更明确会很有帮助。
评论人:gfredericks
Alex,我认为你可能误解了工单 —— 原帖操作者是在建议引导使用 assoc! 的返回值,而不是完全避免使用 assoc!
并且文档字符串不仅是含糊不清的,而且在原帖操作者指出的情况下实际上是错误的。conj! 和 assoc! 在数组和映射之间的过渡点并不返回 coll,而它们在其他情况下的行为应该是我所理解的实现细节。
Gary,你是对的,我确实误解了那部分。
{{assoc}} 和 {{conj}} 都明确说明“返回一个新集合”,而 assoc! 和 conj! 说“返回 coll”。我理解为“返回修改后的集合”,不考虑这是否是相同的实例,但我也可以理解你的方式。
说“返回更新后的集合。”能否传达正确的意思?使用“集合”而不是“coll”可以减少对变量的具体联系,“更新”则更强烈地暗示你应该使用返回值。
评论人:pyrtsa
对于亚历克斯来说,这一更新听起来是正确的,仅供参考。
我觉得这样可以。谢谢亚历克斯。我很乐意提交补丁,但我假设这种变更的补丁太多?
评论人:jafingerhut
如果有必要,补丁正是一种过去曾经用于此类变更的方式,如果涉及的是文档字符串而不是 clojure.org 网页。
是的,需要补丁。
很高兴我提了这个问题。
已附加补丁,该补丁还更新了有相同问题的 pop! 的文档字符串,尽管从理论上讲,由于据我所知 pop! 总是返回相同的集合,因此这可能不是很重要(但我认为这不是合同的一部分)。
由于今天早些时候提交的一些更改,补丁 CLJ-1385-reword-docstrings-on-transient-update-funct.patch 不再适用于最新的 Clojure master。我怀疑由于这些更改是文档字符串更改,因此应该能够简单地更新补丁以干净地应用,但是可能已经将文档字符串更改提交到 master。
附加了新的补丁。
comment made by: richhickey
我认为它还可以更清晰,因为我们希望人们知道原始的 coll 可能已经受到影响并返回,并且必须使用返回值进行后续调用。我认为来自 transients 页面的一些语言应该纳入这些文档字符串。
这样说是否正确?即传入 pop! conj(image: assoc) 等操作的集合在操作完成后内容未定义,而只有返回值的内容是有定义的?
这种强烈的措辞可能会引起人们的注意。
我正在处理这个问题。
未完成,我(仍然)负责这个。