欢迎!请查看关于页面,了解更多有关这是如何工作的信息。
《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!
@Gary – 你是对的,我确实那样读过了。
{{assoc}}和{{conj}}都明确表示“返回一个新集合”,而assoc!和conj!表示“返回coll。”我理解为“返回修改后的集合”,不考虑是否是同一实例,但我也可以按照你的方式理解。
说“返回更新后的集合。”能传达正确的意思吗?使用“集合”而不是“coll”移除了对变量的具体依赖,“更新”更强烈地暗示你应该使用返回值。
评论由:pyrtsa做出
@Alex,我觉得这样修改听起来是正确的,仅供参考。
是的,我认为这样更好。谢谢你,Alex。我很乐意为这个修改提交一个补丁,但我觉得这种变化补丁太大,是吗?
评论由:jafingerhut做出
补丁正是过去进行这类更改的方式,如果它是在文档字符串中,而不是在clojure.org网页上。
是的,我们需要补丁。
很高兴我提出了这个问题。
附带的补丁更新了 pop! 的文档字符串,它也存在同样的问题,虽然可以说它不太重要,因为据我所知,pop! 总是返回相同的集合(但我不认为这是合同的一部分)。
pop!
于2014年4月6日发布的补丁 CLJ-1385-reword-docstrings-on-transient-update-funct.patch,由于今天早些时候提交的一些更改,不再适用于最新的 Clojure 主分支干净地。我怀疑如果考虑到它们是文档字符串更改,那么更新补丁以干净地应用应该是直接的,但主分支可能也提交了文档字符串更改。
附上一个新补丁。
评论人:richhickey
我认为它还可以更加清晰,因为我们需要让人们知道原始的 coll 可能已经受到并返回了,并且必须使用返回值进行后续调用。我认为从 transients 页面的一些语言应该出现在这些文档字符串中。
能否说传入 pop! conj(image: assoc) 等操作后,集合的内容是未定义的,而只有返回值有定义的内容?
这类强烈的措辞可能会引起人们的注意。
我正在处理这个问题。
不完整,我(仍然)拥有这个