Я вполне уверен, что не существует единого умного способа создать этот хэш. Я хотел бы просто быть явным и заявить, что я делаю:
hash = {}
array.each{|x| hash[x] = nil}
Это не выглядит особенно элегантно, но понятно и выполняет свою работу.
FWIW, ваше первоначальное предложение (по крайней мере, под Ruby 1.8.6) не работает. Я получаю сообщение об ошибке «ArgumentError: нечетное количество аргументов для хэша». Хеш. [] Ожидает буквальный, ровный список значений:
Hash[a, 1, b, 2] # => {a => 1, b => 2}
поэтому я попытался изменить ваш код на:
hash = Hash[*array.map {|x| [x, nil]}.flatten]
но производительность ужасна:
#!/usr/bin/ruby -w
require 'benchmark'
array = (1..100_000).to_a
Benchmark.bm(15) do |x|
x.report("assignment loop") {hash = {}; array.each{|e| hash[e] = nil}}
x.report("hash constructor") {hash = Hash[*array.map {|e| [e, nil]}.flatten]}
end
дает
user system total real
assignment loop 0.440000 0.200000 0.640000 ( 0.657287)
hash constructor 4.440000 0.250000 4.690000 ( 4.758663)
Если я что-то здесь не упустил, простой цикл присваивания кажется самым ясным и эффективным способом создания этого хэша.