From: Shugo Maeda Date: 2007-08-24T17:31:24+09:00 Subject: [ruby-list:43929] Re: Hashへの生成順は保障されないのか? 前田です。 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など)の機能が 詰め込まれてますよね。 -- 前田 修吾