Различные способы создания объектов в Ruby - PullRequest
1 голос
/ 18 ноября 2011

Отличаются ли эти методы создания пустого Ruby Hash? Если так, то как?

myHash = Hash.new

myHash = {}

Мне бы хотелось получить четкое представление об управлении памятью в Ruby.

Ответы [ 4 ]

5 голосов
/ 18 ноября 2011

Существует множество способов создать объект Hash в Ruby, хотя конечный результат - это объект того же вида:

hash = { }
hash = Hash.new
hash = Hash[]
hash = some_object.to_h
hash = YAML.load("--- {}\n\n")

Что касается соображений памяти, пустой хэш значительно меньше, чем тот, в котором даже содержится единственное значение. Массивы, как правило, меньше, чем хэши, при небольших размерах, но будут более эффективными при больших масштабах.

Однако на практике важно помнить, что в Ruby каждый раз, когда вы создаете объект, он стоит вам что-то, даже если это только бесконечно малая сумма. Эти маленькие удары складываются, если вы без нужды создаете миллиарды объектов.

Как правило, вам следует избегать создания структур, которые не будут использоваться, и вместо этого создавать их по требованию, если это не усложнит ситуацию без необходимости. Например, типичный шаблон:

def cache
  @cache ||= { }
end

До тех пор, пока этот метод не будет вызван, хэш кэша никогда не определяется. Экономия памяти в этом случае практически незначительна, но если бы при этом загружался большой файл конфигурации или импортировалось несколько сотен МБ данных из базы данных, вы можете себе представить, что экономия будет значительной в тех случаях, когда эти данные не используются.

2 голосов
/ 18 ноября 2011

Два метода абсолютно эквивалентны.

1 голос
/ 18 ноября 2011

Как упомянуто выше, оба являются операционно эквивалентными.Если вы имеете в виду стандартную МРТ / ЯРВ;возможно, эта ветка поможет: http://www.ruby -forum.com / topic / 215163 # new .

0 голосов
/ 18 ноября 2011

С помощью синтаксиса Hash.new вы можете указать, что делать, если в хэше отсутствует какой-либо ключ ( поведение по умолчанию ).С синтаксисом {} он делает еще один шаг.

my_hash = Hash[]

- это еще один способ создания массива;методы [] принимают четное число аргументов.

my_hash = Hash[:a, 1, :b, 2]

Это не имеет ничего общего с управлением памятью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...