Инициализировать хэш нескольких уровней в рельсах - PullRequest
0 голосов
/ 21 марта 2011

Так что у меня некоторые коды выглядят так:

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

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

Ответы [ 2 ]

1 голос
/ 21 марта 2011
{:bar => {:baz => {}}}.merge(@foo)
0 голосов
/ 21 марта 2011

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

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
...