欢迎!有关更多信息,请参阅关于 页面。
《assoc!》和《conj!》的文档字符串都表明 "返回 coll。",可能会暗示(总是)在原地执行暂时的编辑,“coll”是第一个参数。然而,情况并非如此,返回集合应始终用于编辑。
方法:在《conj(image:》和《assoc》)、《pop!》的文档字符串中,将“返回 coll。”替换为“返回更新后的集合。”。
补丁: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!。
assoc!
并且,该文档字符串不仅仅是模糊不清,它实际上在原始发帖者指出的情况下是错误的。《conj!》和{{assoc}}在数组到散列映射转换点并不返回{{coll}},而这些函数在其他情况下返回它们的事实,按照我的理解应该是实现细节。
@Gary,你是对的,我确实误解了。
{{assoc}}和{{conj}}都明确说明“返回一个新的集合”,而assoc!和conj!则说明“返回coll。”我理解为“返回已修改的集合”,不考虑它是否是相同的实例,但我也可以按照你的方式来理解。
conj!
说“返回已更新集合。”能传达正确的意思吗?使用“集合”而不是“coll”消除了与变量的具体联系,“更新”则更强烈地暗示应使用返回值。
评论者:pyrtsa
@Alex,在我看来,这个更新看起来是正确的。
是的,我认为这样更好。谢谢Alex。我很愿意为这个更改提交一个补丁,但我假设对于这种类型的更改,补丁太重了?
评论者:jafingerhut
对于这种类型的更改,如果它出现在文档字符串中而不是clojure.org网页上,补丁正是过去已经实施的方法。
是的,我希望的补丁。
很高兴我提出了这个问题。
附带了一个补丁,该补丁还更新了pop!的文档字符串,它也存在相同的问题,尽管可以说这没那么重要,因为据我所知pop!总是返回相同的集合(但我认为这不是合同的组成部分)。
pop!
由于今天早些时候的一些更改,补丁CLJ-1385-reword-docstrings-on-transient-update-funct.patch不再适用于最新的Clojure master,因为存在一些文档字符串更改。由于这些是文档字符串更改,我认为更新补丁以正常应用应相当直接,但也许是由于已经将文档字符串更改提交给了master。
附带了新的补丁。
评论者:richhickey
我认为这仍然可以更清晰,因为我们希望人们知道原始的集合可能会受到影响并返回,并且返回值必须用于后续调用。我认为从transients页面的一些语言应包含在这些文档字符串中。
能否说,传递给pop! conj(image: assoc)等操作的集合在操作完成后内容未定义,而只有返回值的内容是定义好的?
这种强烈的措辞可能会引起人们的注意。
我在处理这个问题。
不完整,我(仍然)拥有这个问题