Ruby は、ブロックを に渡すことにより、ハッシュの自動有効化をサポートしていますHash.new
。
hash = Hash.new { |h, k| h[k] = 42 }
hash[:foo] += 1 # => 43
構造体の自動有効化も実装したいと思います。これは私が思いつくことができる最高のものです:
Foo = Struct.new(:bar) do
def bar
self[:bar] ||= 42
end
end
foo = Foo.new
foo.bar += 1 # => 43
もちろん、これはフォーム ( foo.bar
) ではなく、名前付きアクセサー ( ) のみを自動有効化します。構造体の自動有効化を実装するより良い方法はありますか?特に、フォームとフォームの両方で確実に機能する方法はありますか?[]
foo[:bar]
foo.bar
foo[:bar]