From: rubikitch@... Date: 2008-02-13T13:07:52+09:00 Subject: [ruby-dev:33734] Re: HashからStructを作る From: Yukihiro Matsumoto Subject: [ruby-dev:33542] Re: HashからStructを作る Date: Thu, 31 Jan 2008 02:28:43 +0900 るびきちです。 > |> Struct.for_hashについては、正直あまり名前が好みじゃないんで > |> すよねえ。 > | > |Struct.newの拡張をやめるとしても、別な方法でHashから作りたいです。 > |ダメモトでStruct.from_hashとかHash#to_structとか言ってみる。 > > まず、ひとつしかインスタンスのないStructをいきなり作るスタイ > ルを推奨すべきかどうかというのが第一の艱難です。 この提案の発端は、Hashのキー集合を固定できないかということです。 Hashを構造体的に使う場合、キーの打ち間違いを例外で検出できないのが最大の問題です。 現状で考えられるのがStructを利用することです。 なので僕はそんなにStructにこだわっているわけではありません。 あるいは、Hashのキーを固定する(追加不可能、存在しないキーにアクセスしたら例外) メソッドを作成できないものでしょうか? Hash#fix_keys, Hash#freeze_keys, Hash#fix, Hash#lock, Hash#pin, Hash#fixate… > ま、それは私の間違いなんで置いといて、そうすると、インスタン > スがひとつしかないStructを毎回作ることになりますね。それって > どれだけうれしいんですかね。外から見る限り、単なるHashと大差 > ないような。もちろん多少メモリ効率は違いますが、それ意外に特 > にうれしいことはなさそうな上に、生成するのにHashひとつ、イン > スタンスごとに無名クラスひとつ作っちゃうのでそこまでメモリ効 > 率もよくはないような。 Hash→Struct変換をするケースでは多くの場合ひとつしかインスタンスを作らないと思います。 このAPIがなくても各自が同じようなことをやると思います。 hash = {:a=>1, :b=>2} Struct.new(*hash.keys).new(*hash.values) # => # > で、仮に推奨すべきだとして、次の艱難が適切な名前ですね。 Kernel#BigDecimalやKernel#URIに倣ってKernel#Structでどうでしょうか? 変換器という意味合いです。 当然Structを指定したら自分自身を返すようにします。 -- rubikitch Blog: http://d.hatena.ne.jp/rubikitch/ Site: http://www.rubyist.net/~rubikitch/