您需要更改您的代码如下:
hash_weekdays = Hash.new
weekdays.each do |item|
hash_weekdays[item[0]] = item[1]
end
hash_weekdays
#=> {"Monday"=>2, "Tuesday"=>4, "Thursday"=>5}
当weekdays
(["Monday",2]
)第一元件被传递到块,块变量被分配它的值:
item = ["Monday",2]
由于需要引用的item
每个元素,这是常见的是使用两种嵌段变量,其值使用并行分配被分配(又名多重分配):
day, nbr = ["Monday",2]
#=> ["Monday", 2]
day #=> "Monday"
nbr #=> 2
这允许你写
hash_weekdays = {} # the more common way of writing hash_weekdays = Hash.new
weekdays.each { |day, nbr| hash_weekdays[day] = nbr } # used {...} rather than do..end
hash_weekdays
这无疑更加清晰。
注意,首先初始化hash_weekdays
到一个空的散列,那么就需要在端线hash_weekdays
如果希望获得的散列的新值(作为方法的最后一行,例如)。可以通过使用该方法Enumerable#each_with_object这减少到一行(非常红宝石样):
weekdays.each_with_object({}) { |item, hash_weekdays| hash_weekdays[item[0]] = item[1] }
#=> {"Monday"=>2, "Tuesday"=>4, "Thursday"=>5}
声明本使用并行分配。传递到块,[["Monday", 2], {}]
第一元件,被分配如下:
item, hash_weekdays = weekdays.each_with_object({}).next
#=> [["Monday", 2], {}]
item
#=> ["Monday", 2]
hash_weekdays
#=> {}
红宝石方式是在稍微更复杂的方式来使用并行赋值:
weekdays.each_with_object({}) { |(day, nbr), hash_weekdays|
hash_weekdays[day] = nbr }
#=> {"Monday"=>2, "Tuesday"=>4, "Thursday"=>5}
正如其他人指出的那样,最直接的答案是使用方法Hash::[]或(在V2.0中引入)Array#to_h:
Hash[weekdays]
#=> {"Monday"=>2, "Tuesday"=>4, "Thursday"=>5}
Hash[*weekdays.flatten] #=> Hash["Monday", 2, "Tuesday", 4, "Thursday", 5]
#=> {"Monday"=>2, "Tuesday"=>4, "Thursday"=>5}
weekdays.to_h
#=> {"Monday"=>2, "Tuesday"=>4, "Thursday"=>5}
感谢您的解释@guitarman,是否有AW唉要修改我的'weekdays.each'循环来克服这个问题? – Brandon
谢谢!完美的作品:) – Brandon