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/