From: Yukihiro Matsumoto <matz / ruby-lang.org> Subject: [ruby-dev:33455] Re: HashからStructを作る Date: Mon, 28 Jan 2008 17:59:52 +0900 るびきちです。 > |HashからStructを作れたらいいなと思いました。 > > どういうAPIが良いと思いますか。例ではStructという名前の関数 > を導入していますが、それが最善だと思いますか? この前は勢いで「Kernel.Struct」と書きましたが、 Struct.newを拡張するか、Struct.for_hashのどちらかですね。 > 「Struct.new」を拡張する場合、メンバーがひとつしかなければ意 > 味が曖昧になるのですが、どちらを選択すべきだと思いますか? > また、それによりプログラムがひとめでわからなくなる側面が増え > たりしませんか? すみません、どういうことでしょうか? たとえば「Struct.new(:a => 1)」は「Struct.new(:a).new(1)」の意味しか思い付きません。 HashからStructを作る場合は、「Struct.new(hash).members == hash.keys」を想定します。 > |理由は、 > |* OpenStructはHashから作成できる。 > > OpenStructはHashですからね。固定メンバーのStructの場合、メン > バーとして存在しないkeyが指定されたらどうなるか、あるいは逆 > に指定されないメンバーがあった場合どうするかを明確にしなけれ > ばなりませんね。 存在しないキーが指定された場合は、エラーにすべきと思います。 そうすることで打ち間違いによるバグが発見しやすくなります。 「存在しないキーが指定された場合は新たなメンバを増やす」ならばOpenStructを使えばいいので。 指定されていないメンバとは「Struct.new(:a,:b).new(1)」のような意味でしょうか? それならば「Struct.new(:a=>1, :b=>nil)」でいいと思います。 -- rubikitch Blog: http://d.hatena.ne.jp/rubikitch/ Site: http://www.rubyist.net/~rubikitch/