以前曾经问过,但我找不到有效的答案。我有以下代码:
[[13,14,16,11],[22,23]].each do |key,value|
puts key
end
理论上应该打印:
0
1
但相反它打印:
13
22
为什么ruby会这样做?
答案 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]且index
为0