h = {"q1"=>0, "q2"=>1, "q3"=>2, "q4"=>3, "h1"=>4, "h2"=>5}
h.each_with_object({}) { |(k,v),g| g[v] = k.to_sym }
#=> {0=>:q1, 1=>:q2, 2=>:q3, 3=>:q4, 4=>:h1, 5=>:h2}
步骤如下(为了 Ruby 新手的利益)。
enum = h.each_with_object({})
#=> #<Enumerator: {0=>"q1", 1=>"q2", 2=>"q3", 3=>"q4",
# 4=>"h1", 5=>"h2"}:each_with_object({})>
将由枚举器生成并传递给块的元素可以通过使用Enumerable#entries 或Enumerable#to_a 将枚举器转换为数组来查看。
enum.entries
#=> [[["q1", 0], {}], [["q2", 1], {}], [["q3", 2], {}],
# [["q4", 3], {}], [["h1", 4], {}], [["h2", 5], {}]]
继续,
enum.each { |(k,v),g| g[v] = k.to_sym }
#=> {0=>:q1, 1=>:q2, 2=>:q3, 3=>:q4, 4=>:h1, 5=>:h2}
在最后一步,Enumerator#each 将enum 生成的第一个元素传递给块,并分配三个块变量。考虑传递给块的enum 的第一个元素以及三个块变量的相关值计算。 (我必须先执行enum.rewind 来重新初始化enum,因为上面的each 将枚举数置于其末尾。参见Enumerator#rewind。
(k, v), g = enum.next
#=> [["q1", 0], {}]
k #=> "q1"
v #=> 0
g #=> {}
见Enumerator#next。因此,块计算是
g[v] = k.to_sym
#=> :q1
因此,
g #=> {0=>:q1}
enum 的下一个元素被传递给块并执行类似的计算。
(k, v), g = enum.next
#=> [["q2", 1], {0=>:q1}]
k #=> "q2"
v #=> 1
g #=> {0=>:q1}
g[v] = k.to_sym
#=> :q2
g #=> {0=>:q1, 1=>:q2}
其余计算类似。