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的行为。它应该…-不,不应该。