欢迎!请查看关于页面,了解更多关于此功能的信息。
`assoc!`和`conj!`的文档字符串都说“返回coll.”,可能暗示transient编辑总是就地执行(coll是第一个参数)。但这并非事实,返回的集合应始终保持使用状态。
方法:在`conj(image: `, `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!
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
我认为可以这样更清楚地表述,因为我们要让人们知道原始集合可能会受到影响并被返回,而返回值必须用于后续调用。我认为来自短暂页面的一些语言应该包含在这些文档字符串中。
是否可以这样理解,在操作完成后,传入pop! conj(image: assoc)等函数的集合的内容是未定义的,而只有返回值才有确定的内容?
这样的强烈措辞可能会引起人们的注意。
我正在处理这个问题。
未完成并且我(依然)拥有这个问题