Zetetic уже дал вам рабочее решение, но вот причина, по которой ваше не сработало:
['a','b','c'].inject({}){|h,v| h.update(v => {}); h[v]}
Это действительно создаст хеш {'a'=>{'b'=>{'c'=>{}}}}
, однако, inject
не вернет этот хеш, он вернет результат последнего вызова в блок и это {}
, потому что h
будет созданным хешем для последнего элемента, то есть {'c' => {}}
и, следовательно, h[v]
будет {}
.
Чтобы увидеть, что нужный хеш действительно создается, но не возвращается, вы можете сначала сохранить передаваемый хеш в переменной, например:
hash = {}
['a','b','c'].inject(hash){|h,v| h.update(v => {}); h[v]}
Таким образом, inject
по-прежнему будет возвращать {}
, но hash
теперь будет содержать хэш {'a'=>{'b'=>{'c'=>{}}}}
. При этом решение Zetetic лучше, так как оно более понятно, что происходит. Отключение впрыскиваемого аккумулятора обычно сбивает с толку и доставляет больше хлопот, чем оно того стоит.