Ruby 迭代数组的数组
以前有人问过这个问题,但我找不到有效的答案。我有以下代码:Ruby 迭代数组的数组,ruby,Ruby,以前有人问过这个问题,但我找不到有效的答案。我有以下代码: [[13,14,16,11],[22,23]].each do |key,value| puts key end 理论上,它应该打印: 0 1 但它却打印: 13 22 ruby为什么会这样做?您可以通过数组的each_index'方法得到想要的结果,该方法返回元素的索引,而不是元素本身。有关更多信息,请参阅[Ruby'sArray`文档。您有一个数组数组,称为二维数组 在循环中,值变量被分配给第一个数组[13,14,16,1
[[13,14,16,11],[22,23]].each do |key,value|
puts key
end
理论上,它应该打印:
0
1
但它却打印:
13
22
ruby为什么会这样做?您可以通过数组的each_index'方法得到想要的结果,该方法返回元素的索引,而不是元素本身。有关更多信息,请参阅[Ruby'sArray`文档。您有一个数组数组,称为二维数组 在循环中,值变量被分配给第一个数组[13,14,16,11] 当您尝试放置value变量时,它只返回第一个元素13 尝试将puts value更改为puts value.to_,这将把数组转换为字符串 如果需要每个值,则向代码中添加另一个循环块,以循环遍历value变量中的每个元素
[[1,2,3],['a','b','c']].each do |key,value|
value.each do |key2,value2|
puts value2
end
end
当您这样做时:
[[13,14,16,11],[22,23]].each do |key,value|
在完成第一次迭代之前,它会进行分配:
key, value = [13,14,16,11]
这样的赋值结果是键为13,值为14。相反,您应该将每个_与_index do |数组、index |一起使用。这会将分配更改为:
array, index = [[13,14,16,11], 0]
其结果是数组为[13,14,16,11],索引为0
为什么ruby会这样做
这是因为当每个迭代器和其他迭代器与块而不是lambda一起使用时,内部实际发生的情况实际上更接近于此:
do |key, value, *rest|
puts key
end
考虑以下代码来说明:
p = proc do |key,value|
puts key
end
l = lambda do |key,value|
puts key
end
使用上述方法,下面将分别将key、value设置为13、14和22、23,并且在第一种情况下,将上述*rest设置为[16、11],并丢弃rest:
[[13,14,16,11],[22,23]].each(&p)
与此相反,以下内容将抛出一个参数错误,因为lambda类似于一个块,除了在算术方面的考虑外,它将接收完整数组作为一个参数,而不包含任何*rest,如上所述,因为参数的数量是严格执行的:
[[13,14,16,11],[22,23]].each(&l) # wrong number of arguments (1 for 2)
要获得您案例中的索引,您需要每个_与其他答案中突出显示的_索引
相关讨论:
但这并不能回答这个问题。OP在问为什么。@andy-我已经添加了两个参考资料,以便进一步阅读这个主题,以防你有兴趣深入了解Ruby的行为。它应该…-不,不应该。