shugo / immutable

immutable data structures for Ruby
31 stars 0 forks source link

Map get API for more flendly with Hash #9

Closed kachick closed 8 years ago

kachick commented 12 years ago

Hashに近い感覚で使いやすくなるよう、いくつかのメソッドを追加しました。

また、Map.#[]の受け取ったハッシュのキーによっては、ペアが消えたり例外が出たため、これを調整しています。

Hash[{2.0 => 3, 2 => 5}]  #=> {2.0=>3, 2=>5}
Map[{2.0 => 3, 2 => 5}]   #=> Map[2 => 5]

Hash[{a: 1, 2.0 => 3}]    #=> {:a=>1, 2.0=>3}
Map[{a: 1, 2.0 => 3}]     #=> NoMethodError: undefined method `<' for nil:NilClass
shugo commented 12 years ago

Mapのキーの集合が全順序になっていないと、無理矢理値を入れることはできても、検索できなくなってしまうのではないでしょうか。 例えばパッチを適用して以下のようなコードを実行すると期待と違う結果になってしまいます。

$ ruby-trunk -I lib -r immutable -e 'm = Immutable::Map[{2.0 => 3, 2 => 5}]; p m[2]; p m[2.0]' 3 3 $ ruby-trunk -I lib -r immutable -e 'm = Immutable::Map[{a: 1, 2.0 => 3}]; p m[2.0]' /home/shugo/src/immutable/lib/immutable/map.rb:181:in []': undefined method<' for nil:NilClass (NoMethodError) from -e:1:in `

'

kachick commented 12 years ago

大変失礼しました、格納後の動作が完全に考慮から外れていました。 該当部分 https://github.com/kachick/immutable/commit/7eec6e5c430a3e8aa7d02a0084f5861b8fdc4589 は本ブランチから外して置きました。

その後BasicObject#__id__Object#hashの利用でなんとか出来ないかとも思ったのですが、やはり意味合いが変わってしまう為断念しました。 お手数をおかけしました。

shugo commented 8 years ago

Merged.

kachick commented 8 years ago

ありがとうございます!