Ruby中如何遍历嵌套数组?新手遍历二维数组遇报错求助
嘿,别担心!作为Ruby新手碰到这种遍历问题太正常了,我来帮你拆解下错误原因,再给你几个好用的解决办法~
先说说你的代码出了啥问题:
- 索引变量初始化错误:你把
index设成了people[0][0],也就是字符串"Bruce",之后index = index + 1相当于试图把字符串和整数相加,Ruby不知道怎么把整数转成字符串来做这个操作,所以直接抛出了TypeError。 - 循环内没有更新数据:你只在循环外面取了第一个人的信息,循环里根本没动
first_name、last_name这些变量,哪怕没报错,也只会一直打印Bruce的信息。 - 字符串拼接语法问题:你的
puts语句里的几个字符串没有用+连起来,其实语法上已经有问题了,只是被前面的类型错误先触发了。
修复后的基础版代码
先给你一个和你原来思路接近的修复版本,手动管理索引:
people = [ ["Bruce", "Wayne", "Batman"], ["Selina", "Kyle", "Catwoman"], ["Barbara", "Gordon", "Oracle"], ["Terry", "McGinnis", "Batman Beyond"] ] # 把index初始化为整数0,这才是数组索引的正确类型 index = 0 4.times do # 每次循环根据当前索引取出对应的人的数组 person = people[index] first_name = person[0] last_name = person[1] hero_name = person[2] # 用Ruby的字符串插值更简洁,也不会有类型问题 puts "#{first_name} #{last_name}, a.k.a. #{hero_name}" # 索引自增,取下一个人 index += 1 end
更Ruby风格的优雅写法
其实Ruby里遍历数组根本不用手动管索引,用each方法会更简洁直观,还不容易出错:
people = [ ["Bruce", "Wayne", "Batman"], ["Selina", "Kyle", "Catwoman"], ["Barbara", "Gordon", "Oracle"], ["Terry", "McGinnis", "Batman Beyond"] ] # 遍历people数组里的每一个子数组,直接把子数组的三个元素赋值给对应的变量 people.each do |first_name, last_name, hero_name| puts "#{first_name} #{last_name}, a.k.a. #{hero_name}" end
这种写法会自动把每个子数组的三个元素分别传给first_name、last_name、hero_name,你直接拿来用就行,完全不用管索引的事儿,这也是Ruby开发者最常用的遍历方式~
额外小提示
以后拼接字符串的时候,尽量用#{}插值而不是+,不仅写起来方便,还能避免很多类型转换的问题(比如如果变量是数字,插值会自动转成字符串)。
内容的提问来源于stack exchange,提问作者Heather_TN
相关产品推荐
相关产品推荐

