キーの集合を別の集合にマッピングするのは、配列だと map でできるけど、
そのマッピング用の Hash 作るのはけっこう面倒くさくね?
リファレンスマニュアルだと、zip して flatten して * 展開とか書いてあるけど
ちょっとあんまりな感じ。というわけで、こんなのはどうだろう。

def Hash.map_from(keys, &block)
if block
Hash[ keys.inject({}) {|h, k| h[k] = block[k]; h } ]
else
Hash[ keys.inject({}) {|h, (k, v)| h[k] = v; h } ]
end
end

使い方:
keys = ['aaa', 'x', 'foge']
Hash.map_from(keys, &:size)
#=> {"aaa"=>3, "x"=>1, "foge"=>4}
Hash.map_from(keys, &:intern)
#=> {"aaa"=>:aaa, "x"=>:x, "foge"=>:foge}
Hash.map_from(keys.each_with_index)
#=> {"aaa"=>0, "x"=>1, "foge"=>2}

ここは偉いひとも見てるぽいので書いてみた。BTS? とかはよく知らん。