欢迎!有关如何工作的更多信息,请参阅关于页面。
`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
Alex,我认为你一定是误解了工单 -- 原始问题建议引导使用assoc!的返回值,而不是完全不使用assoc!。
文档字符串不仅不够明确,而且在OP指出的特定情况下实际上是错误的。conj!和assoc!在数组映射转换为散列映射时刻并不返回coll,而它们在其他方面这样做应该是我理解中的实现细节。
@Gary - 你是对的,我确实理解错了。
assoc和conj都明确指出“返回一个新的集合”,而assoc!和conj!则表示“返回coll”。我理解为“返回修改过的集合”,不考虑它是否是相同的实例,但我也能理解你的想法。
说“返回更新后的集合。”能否传达正确的想法?用“集合”代替“coll”消除了与具体变量的具体联系,“更新”更强烈地暗示你应该使用返回值。
评论者:pyrtsa
@Alex,这个更新听起来对我来说是正确的,虽然无足轻重。
是的,我认为这会更好。谢谢Alex。我很乐意为此提交补丁,但我假设这种更改的补丁太重了,不适合这种情况?
评论者:jafingerhut
补丁正是过去做过这类更改的方法,如果它在文档字符串中而不是clojure.org网页上。
是的,需要这个补丁。
很高兴提问了。
附加的补丁也更新了pop!的docstring,它也有同样的问题,尽管可以说这并不那么重要,因为据我所知pop!总是返回相同的集合(但我不认为这是协议的一部分)。
pop!
由于今天早些时候提交的一些更改,日期为2014年4月6日的补丁CLJ-1385-reword-docstrings-on-transient-update-funct.patch不再干净地适用于最新的Clojure master,因为我怀疑补丁应该很容易更新以干净地应用,因为这些是doc字符串更改,但也可能已经向master提交了doc字符串更改。
附上了一个新的补丁。
评论者:richhickey
我认为这仍然可以更清晰,因为我们想让人们知道原始集合可能会受到影响并返回,并且必须使用返回值进行后续调用。我认为transients页面的一些语言应该包含在这些docstrings中。
能否说在操作完成后,传递给pop! conj(image: assoc)等函数的集合内容是未定义的,只有返回值有定义的内容?
这种强烈的措辞可能会引起人们的注意。
我正在处理这个问题。
未完成且我(仍然)负有责任