欢迎!请查看 关于 页面,以获取更多有关这是如何工作的信息。
无论是 `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! 这样的函数——transients 被用作用性能优化,并且在循环中使用 assoc! 或 conj! 往往是这种优化最快的版本。然而,我认为使文档字符串更加明确是有帮助的。
由 gfredericks发表的评论:
Alex,我认为你可能误解了问题——OP 是建议引导使用 assoc! 的返回值,而不是完全避免使用 assoc!
文档字符串不仅不够明确,在 OP 指出的具体情况下,实际上是不正确的。conj! 和 assoc! 在数组映射过渡到哈希映射的点并不返回 coll,而它们在其他方面这样做的行为,据我所知,应该是实现细节。
Gary,你是对的,我确实读错了。
assoc 和 conj 都明确表示“返回一个新的集合”,而 assoc! 和 conj! 则说“返回 coll。”我理解为“返回修改后的集合”,不考虑这是否是相同的实例,但我也可以以你的方式来解读。
“返回更新后的集合。”这样的说法能传达正确的意思吗?用“集合”代替“coll”消除了与变量的具体联系,“更新”更强地暗示你应该使用返回值。
pyrtsa 发表的评论:
关于 Alex,我觉得这个更新听起来是对的,FWIW。
是的,我认为这样更好。谢谢 Alex。我很乐意为此提交一个补丁,但是我认为这种改变太重要而不能提交补丁吗?
由 jafingerhut 发表的评论:
对于这种在文档字符串中进行改变的情况,补丁正是过去所做过的,如果不是在 clojure.org 网页上。
是的,补丁是期望的。
很高兴我提了这个问题。
附上补丁,该补丁还更新了pop!的docstring,因为它也存在相同问题,尽管可以说这不那么重要,因为据我所知pop!总是返回相同的集合(但我不认为这是合约的一部分)。
pop!
2014年4月6日创建的补丁CLJ-1385-reword-docstrings-on-transient-update-funct.patch不再适用于最新的Clojure master,因为今天早上提交了一些更改。我怀疑由于它们是doc string更改,因此应该很容易更新补丁以确保顺利应用,但也可能有doc string变更已提交给master。
附上新的补丁。
评论者:richhickey
我认为还可以更清晰,因为我们希望人们知道原始的集合可能受到影响并返回,而且返回值必须用于后续调用。我认为transients页面上的某些语言应该包含在这些docstrings中。
能否说,在操作完成后传递给pop! conj(image: assoc)等操作的集合具有未定义的内容,而只有返回值具有定义的内容?
这种强烈的措辞可能会引起人们的注意。
我在处理这件事。
不完整,我(仍然)拥有这个