Инициализировать хэш нескольких уровней в рельсах

Поэтому у меня некоторые коды выглядят следующим образом:

@foo ||= {}
@foo[:bar] ||= {}
@foo[:bar][:baz] ||= {}

Я не о производительности, а о чистоте. Есть ли более красивый или лучший способ сделать это?

2 ответа

Решение
{:bar => {:baz => {}}}.merge(@foo)

Я думаю, что у вас есть хороший, лаконичный способ написания кода, но ниже приведен еще один способ сделать то же самое. Это все равно сделает работу, если вы предпочитаете быть более многословным:

if @foo.nil?
    @foo = { :bar => { :baz => {} } }
else if @foo[:bar].nil?
    @foo[:bar] = { :baz => {} }
else if @foo[:bar][:baz].nil?
    @foo[:bar][:baz] = {}
end

или же

if !@foo
    @foo = { :bar => { :baz => {} } }
else if !@foo[:bar]
    @foo[:bar] = { :baz => {} }
else if !@foo[:bar][:baz]
    @foo[:bar][:baz] = {}
end
Другие вопросы по тегам