Combine 框架 removeDuplicates 的奇怪行为

curious behavior of Combine framework removeDuplicates

考虑:

let test = [(1,true), (2,false), (3,false), (4,true), (5,true), (6,true)]
test.publisher.removeDuplicates { [=10=].1 != .1 }
    .sink { print([=10=].0) }

这是一个 (Int,Bool) 对序列。我想在我的 removeDuplicates 过滤器中说的是:“不要让 Bool 与之前的 Bool 发生变化的任何对通过。”

所以我期望的是:

所有其他人都应该通过,所以结果应该是1,3,5,6

但事实并非如此。这是 1,4,5,6.

谁能解释一下为什么? removeDuplicates 在这里使用什么推理?

认为我知道答案;我认为它正在将来自上游的当前值与允许通过过滤器 的先前值 进行比较。因此,1 通过其 true,然后 23 被抑制,因为它们的 false 不同 .

但这肯定不对吧?当然,我们应该与来自上游 ?

的先前值 进行比较

[文档实际上对此含糊其辞。他们说“只发布与前一个元素不匹配的元素”。我假设这意味着“从上游到达的前一个元素”。但是好像反而是“我们实际发布到下游的前一个元素”的意思?]

removeDuplicates 的行为与其祖父 Rx.NET 的 DistinctUntilChanged 的行为相匹配,您可以查看其源代码 here

在“相等”值“a、a、a、...”的流中,将每个新的“a”存储为先前的值需要复制该值,并可能调整引用计数(如果它是具有参考属性)。抓住第一个“a”可以避免这项工作。