7th Sun
同一構造のStructの再定義問題を回避する
RubyのStructは便利なのでよく使いますが、いくつか欠点があります。
- 無名Structを継承すると、スクリプトのreload時にsuperclass mismatchエラーが出る
- 同一構造のStructを定義しようとしても別なStructオブジェクトが返ってくる
- 名前付きStructの場合、Struct::StructName のような名前空間に定義されるので衝突が心配
これらの問題を回避するために、以下のように Struct.[] を定義することにしました。
ruby>>
def Struct.
name = members.map(&:to_s).sort.map(&:upcase).join('__')
const_defined?(name) ? const_get(name) : new(name, *members)
end
<<--
これを使って
ruby>>
class Dog < Struct[:name, :age, :height, :weight]
end
<<--
のように利用すれば、既に定義済みの場合には定義済みのStructを参照し、そうでない場合には新たにStructを定義するようになるので、上述の問題は解決できます。
なにより、
ruby>>
Struct.new(:name, :age, :height, :weight)
<<--
と書くよりスッキリします。
posted by
genki on Sun 7 Aug 2011 at 00:24 with 0 comments