欢迎!有关如何工作的更多信息,请参阅 关于 页面。
《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发表
亚历克斯,我想你可能误解了这张票据--原始帖子的作者建议引导使用assoc!的返回值,而不是完全避免使用assoc!。
assoc!
而且文档字符串不仅仅是不明确的,它在该原始帖子所指出的情况下实际上是错误的。conj!和{{assoc}}在数组映射过渡到哈希映射的点并不返回{{coll}},而且它们在其他情况下这样做应该是一个实现细节,据我所知。
conj!
@Gary - 你是对的,我确实看错了。
{{assoc}}和{{conj}}都明确地说“返回一个新的集合”,而assoc!和conj!说“返回coll。”我读作“返回修改后的集合”,不考虑它是否是同一个实例,但我也可以按照你的方式理解。
说“返回更新后的集合。”传达正确的意思吗?用“集合”代替“coll”消除了与变量的具体联系,“updated”更强烈地暗示了你应该使用返回值。
评论由:pyrtsa发表
@Alex,这个更新让我觉得是正确的,意思是。
是的,我认为这样更好。谢谢亚历克斯。我很乐意为此提交一个补丁,但我想象这些补丁对这个类型的变化来说是太重啦?
评论由:jafingerhut发表
补丁正是过去为这类变化所做的,如果这是在文档字符串中,而不是在clojure.org网页上。
确实,需要补丁。
很高兴提出过这个问题。
附上补丁,同时更新了《pop!》文档字符串,它也存在相同问题,尽管可以认为这不太重要,因为据我所知,`pop!` 总是返回相同的集合(但我认为这并不属于合同的一部分)。
由于今天早些时提交了一些更改,补丁 CLJ-1385-reword-docstrings-on-transient-update-funct.patch(日期为2014年4月6日)不再干净地应用于最新的Clojure主线。我怀疑,鉴于这是文档字符串的更改,更新补丁以干净应用应该是简单的,但也在主线中提交了文档字符串更改。
附上新补丁。
评论者:richhickey
我认为它还可以更清晰,因为我们要让人们知道原始的coll可能在操作后受到影响并被返回,而返回值必须用于后续调用。我认为transients页面的一些语言应该包含在这些文档字符串中。
能否说在操作完成后传递给pop! conj(image: assoc)等操作的集合的内容是未定义的,而只有返回值的内容是定义好的?
这种强烈的措辞可能会引起人们的注意。
我正在处理这个问题。
未完成,我(仍然)负责这个问题