如何将 Smalltalk 中的两个字典与 oneliner 合并?

mel*_*des 8 collections smalltalk

可能存在特定于方言的方式,或者可能存在通用方式。我有两本字典,让我们说:

a := {'a' -> 1} asDictionary.
b := {'b' -> 2} asDictionary.
Run Code Online (Sandbox Code Playgroud)

现在我想c成为aand的联合b

Lea*_*lia 5

这取决于您是想要第三个对象还是更喜欢包含,例如b, into a

对于第一种情况

c := Dictionary new.
a keysAndValuesDo: [:k :v | c at: k put: v].
b keysAndValuesDo: [:k :v | c at: k put: v].
Run Code Online (Sandbox Code Playgroud)

对于第二

b keysAndValuesDo: [:k :v | a at: k put: v].
Run Code Online (Sandbox Code Playgroud)

另请注意,该操作不是可交换的,这意味着如果两个字典中出现相同的键,则在结果中存活的键是最后添加的键。


mel*_*des 2

c := a, b在 Pharo 中有效(但在 Dolphin 中无效)

  • 我不喜欢它......到目前为止,二进制消息`,`仅用于序列(SequenceableCollection),对于序列(SequenceableCollection)来说它是非常自然的。字典是无序的,重叠的键将被融合。考虑到 Pharo 也有“union:”,在我看来这是一个糟糕的选择。 (2认同)
  • 请注意,这个糟糕的选择最初是在 Squeak 中做出的,而不是在 Pharo 中做出的。 (2认同)