您需要将代码更改为以下内容:
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 方法将其简化为一行(非常类似于 Ruby):
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
#=> {}
Ruby 的方式是以稍微复杂的方式使用并行赋值:
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}