« Return to Thread: [ruby-list:43857] Hashへの生成順は保障されないのか?

[ruby-list:43929] Re: Hashへの生成順は保障されないのか?

by Shugo Maeda :: Rate this Message:

Reply to Author | View in Thread

前田です。

On 08/23/2007 01:42 PM, Tanaka Akira wrote:
> というわけで、Hash::Ordered とかとして別に作るのがいいんじゃ
> ないですかね。
>
> そして、リテラルの {} を Hash::Ordered にするとかどうですか
> ね。{} にはどこにも hash という単語が出てきませんし、記法と
> しても順序がありますし。まぁ、1次元の文字列でプログラムを書
> く以上、順序の無い記法というのはまずありえないわけですが...

空のHashを作る時にHash.newの代りに{}を使っているコードが多い
ので、かなりの部分は実際にはHash::Orderedが使われることになる
のではないでしょうか。

excelsior:ruby-trunk$ fgrep '= {}' lib/**/*.rb|wc -l
377
excelsior:ruby-trunk$ fgrep '= Hash.new' lib/**/*.rb|wc -l
40

極端にHashをよく使うプログラム以外でメモリ効率がそれほど悪く
なければ、Hashそのものに順序を付けてしまう方がすっきりしてい
てよいと思います。
# 効率上の問題が大きければ、組み込みの順序付Hashはあきらめる
# ということで。
また、互換性に関しては、1.8→1.9で互換性が保たれていれば、そ
れほど大きな問題ではないのではないでしょうか。

On 08/24/2007 03:04 PM, Yugui wrote:
>  * Hashという名前である以上は順序は期待できないのが自然だと思います

一般的にHashに順序を期待すべきでないというのはその通りだと思
うのですが、だからといってRubyのHashに順序があってはいけない
ということはないと思います。
それにArrayにもいろんなコレクション(queue/stackなど)の機能が
詰め込まれてますよね。

--
前田 修吾

 « Return to Thread: [ruby-list:43857] Hashへの生成順は保障されないのか?