Существует множество способов создать объект Hash в Ruby, хотя конечный результат - это объект того же вида:
hash = { }
hash = Hash.new
hash = Hash[]
hash = some_object.to_h
hash = YAML.load("--- {}\n\n")
Что касается соображений памяти, пустой хэш значительно меньше, чем тот, в котором даже содержится единственное значение. Массивы, как правило, меньше, чем хэши, при небольших размерах, но будут более эффективными при больших масштабах.
Однако на практике важно помнить, что в Ruby каждый раз, когда вы создаете объект, он стоит вам что-то, даже если это только бесконечно малая сумма. Эти маленькие удары складываются, если вы без нужды создаете миллиарды объектов.
Как правило, вам следует избегать создания структур, которые не будут использоваться, и вместо этого создавать их по требованию, если это не усложнит ситуацию без необходимости. Например, типичный шаблон:
def cache
@cache ||= { }
end
До тех пор, пока этот метод не будет вызван, хэш кэша никогда не определяется. Экономия памяти в этом случае практически незначительна, но если бы при этом загружался большой файл конфигурации или импортировалось несколько сотен МБ данных из базы данных, вы можете себе представить, что экономия будет значительной в тех случаях, когда эти данные не используются.