From: Fujimoto Hisa Date: 2007-08-24T21:17:22+09:00 Subject: [ruby-list:43935] Re: Hashへの生成順は保障されないのか? 藤本です。 立場は、Hashリテラルの左から順が保証されるとうれしい派です。 # RubyCocoaでObjective-Cのメッセージ送信に使える リテラルでの左から順の保証が実現するなら、それがどんなふうに実装される かにはあまりこだわりはありません。なので「リテラルの実体=順序を保障す る改良Hash」でも十分にありがたいのですが、さらに、現在のHashリテラルと プログラミング上の互換性が維持されていれば、リテラルの実体はHashでなく てもいいと思っています。 On 8/24/07, Yukihiro Matsumoto wrote: > In message "Re: [ruby-list:43927] Re: Hashへの生成順は保障されないのか?" > on Fri, 24 Aug 2007 15:04:52 +0900, Yugui writes: > > |> そして、リテラルの {} を Hash::Ordered にするとかどうですか > |> ね。{} にはどこにも hash という単語が出てきませんし、記法と > |> しても順序がありますし。まぁ、1次元の文字列でプログラムを書 > |> く以上、順序の無い記法というのはまずありえないわけですが... > | > |同意です。 > | * Hashという名前である以上は順序は期待できないのが自然だと思います > | * 順序を保たないで効率を重視したい場合の選択肢を残して欲しいです。 > | * リテラルには順序があるように見えるという意見には一理あります。 > | * リテラル表記を用いる大部分のケースにおいて、順序を保つコストは > | 許容できると思います。 > | > |なので > | * Hashクラスは現状維持 > | * Hash::Orderedを新設 > | * 従来ハッシュリテラルと呼ばれていた表記はHash::Orderedのリテラルに。 > | * Hash[:a => 1, :b => 2]のような表記でHashのインスタンスを生成できればよい。 > > 同意しません。 > > * 全く同じ機能で性質だけ異なるクラスを複数用意するのは大ク > ラス主義を標榜するRuby的でない > > * Hashという名前はHashアルゴリズムを使っていることしか意味 > しない。keyの登場順序があるかどうかはスコープ外。ただし、 > Rubyで順序があると他の言語で「順序はないのか」と騒ぐ人が > 居たりして、教育的問題が発生する可能性は否定しない。 > > * 時間効率には順序を保たないかどうかは関係ない。 > > * 空間効率にはある程度関係があるが、ちゃんとベンチマークを > 取ってみないとなにも言えない。それでも、どれだけ重大かは > ケースバイケースだと思うけど。 > > * とはいえ、インスタンス変数やシンボルテーブルにまで順序を > 保証するのはやりすぎなので、それはやめる方向で。 > > と考えています。ですから、将来ありえる組み合わせは > > * 1.8のまま、順序は導入しない > * Hashに順序を導入する(ただし、インスタンス変数やシンボルテー > ブルなどにはない) > > のいずれかではないかと。気持ち的には後者に傾いています。 railsで多用されているようなキーワード引数のかわりなど、Hashリテラルの使 われ方としては: * 要素数が少なめ * 全てのキー値を使うことが多い * 新しい値を入れることは少ない  * 左から順に繰り返す(とうれしい。この話題の発端) というパターンが多いのではないかと思います(間違った推測かもしれません が)。このタイプの使われ方に最適なのはどれか、あるいはたいして違いがない のか。というところが、リテラルの実体にふさわしいデータ構造を選択する上 でのポイントのひとつだと思います。 もし、プログラミング上の互換性を維持できるより適切なデータ構造(どうなん でしょう?>データ構造に詳しい方々)があれば、リテラルの実体をHashからそ ちらに乗り換えるという選択もありうるのではないかと思います。 藤本尚邦(hisa)