欢迎!请参阅关于页面以了解更多关于这是如何工作的信息。
对于`assoc!`和`conj!`的文档字符串都说“返回coll.”,可能会暗示(总是)就地编辑发生,其中coll是第一个参数。然而,情况并非如此,应始终使用返回的集合。
方法:在`conj(image: , assoc)`,`pop!`的文档字符串中将“返回coll.”替换为“返回一个更新后的集合”。
assoc)`,`pop!`的文档字符串中将“返回coll.”替换为“返回一个更新后的集合”。
补丁:CLJ-1385-reword-docstrings-on-transient-update-funct-2.patch
审核:Alex Miller
评论由:alexmiller
当修改transient集合时,需要使用诸如assoc!等函数返回的集合。这里的!表示其破坏性。transients页面(https://clojure.org/transients)对调用模式进行了相当明确的描述:“必须在下一个调用中捕获和使用返回值。”
我不同意我们应该引导程序员远离使用诸如assoc!之类的函数--transients用作性能优化,而在循环中使用assoc!或conj!通常是那种速度最快的方法。然而,我认为使文档字符串更加明确将是很有帮助的。
评论者:gfredericks
Alex,我想你可能误解了票据——原始提出者是建议指引使用assoc!的返回值,而不是完全避免assoc!。
assoc!
而且,文档字符串不仅仅是不清晰,的确在原始提出者所指出的特定情况下是不正确的。conj!和{{assoc}}在数组映射过渡到哈希映射的点上不返回{{coll}},而它们在其他方面这样做是被认为是实现细节,据我所知。
conj!
@Gary,你是对的,我确实误解了那部分。
{{assoc}}和{{conj}}都明确指出“返回一个新集合”,而assoc!和conj!则说“返回coll”。我理解为“返回修改后的集合”,不考虑是否是相同的实例,但我也可以理解你的方式。
说“返回更新后的集合。”能否传达正确的意思?使用“集合”而不是“coll”切断了与变量的具体关联,“更新”更强烈地暗示你应该使用返回值。
评论者:pyrtsa
@Alex,我个人觉得这个更新看起来很正确。
是的,我认为这样更好。谢谢你,Alex。我很乐意为此提交一个补丁,但我假设这种改变补丁太大了吗?
评论者:jafingerhut
补丁正是过去为这种改变所做的,如果它在文档字符串中而不是在clojure.org网页上。
是的,需要这个补丁。
很高兴提出这个问题。
附加了一个补丁,它还更新了 pop! 的 docstring,这也存在同样的问题,尽管据我所知,由于 pop! 总是返回相同的集合,这可能不太重要(但我认为这并不构成合约的一部分)。
pop!
由于今天早些时候提交了一些更改,因此2014年4月6日的补丁 CLJ-1385-reword-docstrings-on-transient-update-funct.patch 已经不再适用于最新的 Clojure master。我怀疑,鉴于它们是关于 docstring 的更改,应该可以很容易地更新补丁以便干净地应用,但如果 master 上也提交了 docstring 的更改,则可能会有问题。
附加了一个新的补丁。
评论者:richhickey
我认为它还可以更清晰一些,因为我们希望让人们知道原始的 coll 可能已被影响并返回,并且必须将返回值用于后续调用。我认为-transients 页面上的一些语言应该包含在这些 docstrings 中。
能否说,在操作完成后,传入 pop! conj(image: assoc) 等。的集合的内容未定义,而只有返回值的内容是定义好的?
这种强烈的措辞可能会引起人们的注意。
我正在处理这个问题。
未完成且我(仍然)拥有这个问题