You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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(' ')

代码解释

  1. flat_map:代替普通的map,它会把每个子数组生成的多个拼接项直接扁平化到一个大数组里,省去后续手动flatten的步骤。
  2. 基础拼接base:每个子数组长度至少为2,所以sub_arr[0]和sub_arr[1]一定存在,直接拼接没问题。
  3. 条件添加后续项:通过判断子数组的size,只有当元素存在时才生成对应的拼接项,彻底避免nil的出现。
  4. 最终输出:把所有拼接项用空格连接,得到你期望的结果: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:38:34