欢迎!请参阅关于页面,了解更多关于它是如何工作的信息。
如果merge使用临时的的话,会更好。
修补程序 - clj-1458-7.patch
方法 将c.c/merge迁移到核心功能中较晚的位置,在transients和reduce之后。将旧版本作为merge1保留,以供在先于新定义的案例中使用。使APersistentMap/conj和ATransientMap/cons了解IKVReduce。
附带的修补程序保留了merge的两个现有行为- 元数据传播- 合并的右侧可以是Map.Entry、大小为2的IPersistentVector和普通映射。
由以下人员审核
评论者:jawolfe
我今天将尝试制作一个补丁。
此补丁(transient-merge.diff)使merge、merge-with和zipmap(因为它就放在那里,显然可以从transients中受益)使用transients。
三个潜在问题- 我不得不移动函数,因为它们依赖于transient和其朋友们。我假设这比向前声明更有利。这是我能找到的最好的地方,但愿意将它们移动到其他地方。- 我添加了多个arity,以避免对transient一个参数可能产生的性能成本。如果需要,我愿意撤销这一做法。- 我不得不稍微修改merge-with中的逻辑,因为transient maps不支持contains?(或find)。
由:michalmarczyk 贡献的评论
我在 2012 年 5 月 30 日为 {{zipmap}} 发布了单独的票据,带有补丁:CLJ-1005。
啊,对不起,如果我做得太过分了。如果可以让事情变得简单,我愿意从这个补丁中删除这个更改 —— 只需告诉我。
由:gshayban 贡献的评论
附加一个替代方法,在协议加载完毕后再延迟合并,然后使用转置器。
由:michaelblume 贡献的评论
看起来您两次做了 (get m k) —— 这不应该在局部中抛出吗?
哦,我的意思是,我在局部中写的是“put”,这是一个词语的选择不当。
是的,是这样的 —— 在 CLJ-700 被提交后就不会再使用 get 了。
我们应该添加性能测试。合并两个映射、三个映射、多个映射,以及切换映射的大小,对于合并-with,切换冲突百分比。
需要回到(某些身份)逻辑,否则元数据会从第一个提供的除外的映射中传播。我会稍后修复。
不知道这是否应该被允许,但这会中断
(merge {} (link: :foo 'bar))
该链接在 compojure-api 中广泛使用
https://github.com/metosin/compojure-api/blob/0.16.6/src/compojure/api/meta.clj#L198
Ghadi,contains? 使用 get 进行底层的操作,所以仍然是两次 get,是吗?看起来坚持使用 ::none 技巧可能会有更高的性能。
评论者:bronsa
这个需要 if-let + find。
新的补丁解决了一系列问题
CLJ-1458-transient-merge3.patch 移除了愚蠢的内联宏,并改用单例函数。
不错 =)
这应该附带测试。如果我们想保留与 MapEntry 合并的能力,我们应该进行测试。这与其说是补丁的弱点,不如说是现有测试的弱点。我在测试套件中看到了几次合并和 merge-with 的使用,但没有看到测试目的是检验它们的行为。