如何在二维数组循环内部维护计数器且不使用外部临时变量?
解决Ruby循环内无外部变量统计执行次数的问题
嘿,这个问题我太熟悉了!你碰到的是循环内变量作用域的典型坑——每次迭代都把counter重新初始化为0,输出当然一直是1啦。不用额外定义外部临时变量的话,Ruby有好几个优雅的方案,给你列出来:
方法1:用each_with_index(最直观)
Ruby数组自带的each_with_index方法会把每个元素和它的索引(从0开始)一起传递给代码块,我们只需要把索引加1,就是当前的循环次数:
# 先补全你数组里缺失的逗号哦,不然会语法报错 arr = [[2,3], [4,7], [2,9]] arr.each_with_index do |(x, y), index| counter = index + 1 p counter # 会依次输出1、2、3 end
这个方法完全不需要外部变量,而且逻辑清晰,一眼就能看懂。
方法2:用with_index指定起始值(更简洁)
如果不想自己加1,还可以给with_index传一个起始参数,让计数器直接从1开始:
arr = [[2,3], [4,7], [2,9]] arr.each.with_index(1) do |(x, y), counter| p counter # 直接输出1、2、3 end
这里each返回的枚举器调用with_index(1),把起始计数设为1,代码块里的counter就是当前的循环次数,写法更清爽。
方法3:用inject(累积式实现)
如果你想试试更函数式的写法,inject(别名reduce)也能搞定,它会帮你维护一个累积值:
arr = [[2,3], [4,7], [2,9]] arr.inject(0) do |counter, (x, y)| counter += 1 p counter counter # 必须返回counter,不然下一次迭代会用nil! end
inject的初始值是0,每次迭代把累积的counter传进去,加1后输出,再把新的counter返回给下一次迭代,同样不需要外部变量。
最后提个小细节:你原来的数组[[2,3], [4,7] [2,9]]里[4,7]后面少了个逗号,这会导致Ruby语法错误,记得补上哦!
内容的提问来源于stack exchange,提问作者Justyna Mostowiak
相关产品推荐
相关产品推荐

