Ответ 1
С помощью Hash.new вы можете установить значение по умолчанию для хэша для снятых ключей. Это очень полезно, если вы делаете статистику, потому что Hash.new(0)
позволит вам увеличивать ключи без явной инициализации.
Мне было любопытно узнать больше различий между [] и Array.new и {} и Hash.new
Я использовал те же тесты на нем и, похоже, сокращает количество победителей.
require 'benchmark'
many = 500000
Benchmark.bm do |b|
b.report("[] \t") {many.times { [].object_id }}
b.report("Array.new \t") { many.times { Array.new.object_id }}
b.report("{} \t") {many.times { {}.object_id }}
b.report("Hash.new\t") { many.times { Hash.new.object_id }}
end
user system total real
[] 0.080000 0.000000 0.080000 ( 0.079287)
Array.new 0.180000 0.000000 0.180000 ( 0.177105)
{} 0.080000 0.000000 0.080000 ( 0.079467)
Hash.new 0.260000 0.000000 0.260000 ( 0.264796)
Мне лично нравится использовать сокращенный код [] и {}, код выглядит таким классным и читаемым.
Любой другой указатель, в чем разница между ними? что происходит за сценой, которая делает ее настолько лучше, и предложения, если есть, когда использовать, что?
Я нашел ссылку , но хотел получить дополнительную информацию.
приветствий.
С помощью Hash.new вы можете установить значение по умолчанию для хэша для снятых ключей. Это очень полезно, если вы делаете статистику, потому что Hash.new(0)
позволит вам увеличивать ключи без явной инициализации.
Так что за полмиллиона раз все они бежали "очень быстро". Я предпочитаю литералы на любом языке ([], {}, 0, "и т.д.), Но литералы не могут делать все (см. Документацию для других форм конструктора). Напишите чистый код и будьте последовательны: здесь нет проблемы:)
Тем не менее, я подозреваю, что литералы избегают постоянного поиска и вызова метода, что приводит к тому, что они быстрее, по крайней мере, в этой конкретной реализации.. (кто-то с большим количеством smarts, чем я, мог посмотреть на промежуточный AST, созданный для доказательства/опровержения этого.)
То есть, что, если Hash
, разрешенный для пользовательского класса или Hash.new
, был заменен специальным методом? Невозможно сделать это с помощью {}
. Кроме того, методы должны иметь дело с дополнительными аргументами (или блоками), в то время как литералы этого не делают.
Роберт уже упомянул значение по умолчанию Hash.new
Вы также можете использовать дополнительные значения по умолчанию с блочным вариантом Hash.new
:
x = Hash.new { |hash, key|
hash[key] = key * 2
}
p x #-> {}
p x[1] #-> 2
p x #-> {1=>2}
Array.new
также может использоваться для получения значений по умолчанию:
p Array.new(5, :a) #-> [:a, :a, :a, :a, :a]