欢迎!请查阅关于页面以获取更多关于如何使用本站的信息。
assoc!和conj!的文档字符串说“返回coll”,可能暗示瞬时编辑总是就地发生,其中的“coll”是第一个参数。但是,情况并非如此,应始终使用返回的集合。
assoc!
conj!
方法:在conj(image:,assoc),《pop!的文档字符串中将“Return coll.”替换为“返回一个更新的集合。”。
conj(image:
assoc)
补丁: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!。
文档字符串不只是一个不明确的,它在原帖主指出的情况下实际上是错误的。conj! 和 assoc 并不在数组映射转换为哈希映射的点返回 {{coll}},而它们在其他方面属于实现细节,据我所知。
assoc
@Gary - 你是对的,我确实读错了。
{{assoc}} 和 {{ conj}} 都明文说明“返回一个新的集合”,而 assoc! 和 conj! 说明“返回 coll。”我读作“返回修改后的集合”而不考虑是否是相同的实例,但我也可以按照您的方式读。
说“返回更新后的集合。”是否能够传达正确的意思?使用“集合”代替“coll”避免了具体变量之间的联系,“更新”更强烈地暗示你应该使用返回值。
评论由:pyrtsa
@Alex,这个更新让我觉得听起来很正确,据我所知。
是的,我认为这样更好。谢谢Alex。我很高兴为这一点提交补丁,但是我推测补丁对于这种更改太大了?
评论由:jafingerhut
对于这种更改,补丁正是过去所完成的事情,如果它在文档字符串中而不是在 clojure.org 网页上。
是的,需要补丁。
很高兴我提出了这个问题。
附上了补丁,该补丁还更新了《pop!》的文档字符串,它也存在相同的问题,尽管从我的了解来看,《pop!》总是返回相同的集合,但这可能不是合同的一部分。
2014年4月6日的补丁CLJ-1385-reword-docstrings-on-transient-update-funct.patch,由于今天早些时候提交的一些更改,不再适用于最新的Clojure master,我怀疑如果这些更改是文档字符串更改,那么更新补丁以正常应用应该是简单的,但是主分支上也可能有提交的文档字符串更改。
附上了一个新的补丁。
评论者:richhickey
我认为这还可以更清晰,因为我们希望人们知道原始集合可能会受到影响并返回,且返回值必须用于后续调用。我认为从“transients”页面中的一段话应该包含在这些文档字符串中。
我们能否说,在操作完成后,传入pop! conj(image: assoc)等操作中的集合具有未定义的内容,而只有返回值具有定义明确的内容?
这样的强烈言辞可能会引起人们的注意。
我正在处理这个问题。
未完成且我还保留这个问题