辞書のキーと値をひっくりかえす

某 Ruby スレで見かけたコード。

h1={ 1=>"A", 2=>"B", 3=>"B" }
h2={}
h1.each { |k,v| (h2[v] ||= []) << k }
puts h2

一瞬、意味がわからなかったのがみょーに悔しかったので、なんとなく SqueakSmalltalk に(ほぼ等価に)書き直して気を紛らわしてみたり。

srcDict dstDict
srcDict _ Dictionary new. srcDict at: 1 put: 'A'; at: 2 put: 'B'; at: 3 put: 'B'. dstDict _ Dictionary new. srcDict keysAndValuesDo: [: key : value | (dstDict at: value ifAbsentPut: OrderedCollection new) add: key]. ^ dstDict