Ruby:如何在同一行打印不同长度嵌套数组的指定拼接元素
解决Ruby嵌套数组拼接时的Nil报错问题
这个问题的核心是你直接访问了可能不存在的数组元素(x[2]、x[3]),当子数组长度不足3或4时,这些位置的元素会返回nil,而Ruby不允许把nil和字符串直接拼接,所以抛出了TypeError: no implicit conversion of nil into String。
我们可以通过先判断元素是否存在,再生成对应的拼接项来解决这个问题,同时贴合你想要的输出格式:
解决方案代码
letters = [["A", "B"],["C", "D", "F", "G"],["H", "I", "J" ]] # 遍历每个子数组,生成对应的拼接项并扁平化结果 output_items = letters.flat_map do |sub_arr| # 基础拼接:前两个元素的组合,每个子数组都有这一项 base = sub_arr[0] + sub_arr[1] current_items = [base] # 如果子数组有第三个元素,添加base+第三个元素的组合 current_items << base + sub_arr[2] if sub_arr.size >= 3 # 如果子数组有第四个元素,添加base+第四个元素的组合 current_items << base + sub_arr[3] if sub_arr.size >= 4 current_items end # 用空格连接所有项并打印 puts output_items.join(' ')
代码解释
flat_map:代替普通的map,它会把每个子数组生成的多个拼接项直接扁平化到一个大数组里,省去后续手动flatten的步骤。- 基础拼接
base:每个子数组长度至少为2,所以sub_arr[0]和sub_arr[1]一定存在,直接拼接没问题。 - 条件添加后续项:通过判断子数组的
size,只有当元素存在时才生成对应的拼接项,彻底避免nil的出现。 - 最终输出:把所有拼接项用空格连接,得到你期望的结果:
AB CD CDF CDG HI HIJ
另一种可选写法(用fetch处理默认值)
如果你习惯用fetch方法来处理数组元素的默认值,也可以这样写:
letters = [["A", "B"],["C", "D", "F", "G"],["H", "I", "J" ]] output_items = letters.flat_map do |sub_arr| base = sub_arr[0] + sub_arr[1] [ base, # 用fetch获取元素,不存在则返回空字符串,再用presence过滤空值 (base + sub_arr.fetch(2, '')).presence, (base + sub_arr.fetch(3, '')).presence ].compact # 去掉nil项 end puts output_items.join(' ')
这种写法利用fetch的第二个参数设置默认值(空字符串),再用presence把空字符串转为nil,最后用compact移除nil,同样能得到正确结果,但不如第一种写法直观。
内容的提问来源于stack exchange,提问作者Suspeg
相关产品推荐
相关产品推荐

