评论者:alexmiller
我们必须考虑向量或除了映射外的关联数据结构。我也宁愿不使用标志,而是将其留空以移除多个项。
与类似的表达式
(update-in [{:foo 1}] [0] dissoc :foo)
我们将会得到{{[{}]}},所以目前的方式确实会留下空集合。
我还查看了现有的 一些 dissoc-in 实现——比如 core.incubator、taoensso.encore、clj-http、medley、useful、plumbing 等。大多数使用单一键路径并且留下空集合——这些大多源自 incubator 版本。encore 使用多个路径通过将键路径与最终要 dissoc 的叶子键分开来工作(可变数量的)。medley、useful 和 plumbing 是仅处理映射的,如果遇到空映射则移除。
我不认为我们会在核心库中创建一个仅限映射的版本(因为所有其他的 -in 函数都是通用的),因此我得出结论,我们需要一个可以留空集合的 dissoc-in。鉴于这一点,我不确定dissoc-in 有没有足够的附加价值超过 update-in + dissoc 以至于值得添加到核心库中,尤其是在它已经存在于各种实用库中(在很多情况下语义各不相同)。这样我们可能会破坏(或至少使)许多现有 dissoc-in 实现的用户们感到不便。我将为此保留意见,但我倾向于在此阶段拒绝此增强。