迭代数组数组

时间:2014-04-30 10:33:44

标签: ruby

以前曾经问过,但我找不到有效的答案。我有以下代码:

[[13,14,16,11],[22,23]].each do |key,value|
  puts key
end

理论上应该打印:

0
1

但相反它打印:

13
22

为什么ruby会这样做?

4 个答案:

答案 0 :(得分:2)

  

为什么ruby会这样做?

这是因为实际在内部发生,当each和其他迭代器与块而不是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(类似于一个块除了涉及arity注意事项)将接收完整数组作为参数(没有任何*rest如上所述,因为严格执行了参数的数量):

[[13,14,16,11],[22,23]].each(&l) # wrong number of arguments (1 for 2)

要获得您的案例中的索引,您需要在其他答案中突出显示each_with_index

相关讨论:

答案 1 :(得分:0)

您可以使用Array的{​​{1}}数组`文档] 1获取所需内容,以获取更多信息。

答案 2 :(得分:0)

你有一个数组数组 - 称为二维数组。

在你的循环中,你的"值"变量分配给第一个数组[13,14,16,11]

当您尝试puts"值"变量,它只返回第一个元素,13。

尝试将puts value更改为puts value.to_s,这会将数组转换为字符串。

如果你想要每个值,那么在代码中添加另一个循环块,循环遍历" value"中的每个元素。变量

[[1,2,3],['a','b','c']].each do |key,value|
  value.each do |key2,value2|
    puts value2
  end
end

答案 3 :(得分:0)

当你这样做时:

[[13,14,16,11],[22,23]].each do |key,value|

在第一次迭代完成之前,它进行了一项任务:

key, value = [13,14,16,11]

这样的作业将导致key为13而value为14.相反,您应该使用each_with_index do |array, index|。这会将作业更改为:

array, index = [[13,14,16,11], 0]

array为[13,14,16,11]且index0

会导致