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

Ruby嵌套each块中部分数组元素意外为nil的解决方法

解决数组两两配对时出现nil的问题

你的代码里出现nil的核心问题是把数组元素当成了索引来用:
在each循环里,n和x是数组里的具体元素值(比如3、4、-7这些),但你却写了arr[n]和arr[x]——这相当于用元素值作为索引去数组里取值。当元素值是负数(比如-7)或者大于等于数组长度(你的数组长度是6,元素6对应的arr[6]就超出范围),Ruby会返回nil,这就是输出里出现空值的原因。

另外,用arr.index(n) == arr.index(x)判断是否是同一个元素也有隐患:如果数组里有重复元素,index只会返回第一个匹配项的索引,导致两个不同位置的相同元素被误判为同一个,不会配对。


方案1:直接使用循环变量(元素值)

既然n和x已经是数组元素,直接打印它们就行,不用再通过索引取一次:

def remove_sum_of_zero(arr)
  arr.each do |n|
    arr.each do |x|
      unless arr.index(n) == arr.index(x)
        puts "#{n} is being checked with #{x}"
      end
    end
  end
end

numArr = [3, 4, -7, 5, -6, 6]
remove_sum_of_zero(numArr)

注意:这个方案还是存在重复元素的判断问题,如果数组有重复值(比如[3,3,4]),两个3会被当成同一个元素,不会配对。

方案2:遍历索引(更严谨)

如果要确保每个位置的元素和其他位置的元素都配对,不管元素是否重复,最好遍历索引:

def remove_sum_of_zero(arr)
  arr.each_with_index do |n, i|
    arr.each_with_index do |x, j|
      unless i == j
        puts "#{n} is being checked with #{x}"
      end
    end
  end
end

numArr = [3, 4, -7, 5, -6, 6]
remove_sum_of_zero(numArr)

这个方法用索引i和j判断是否是同一个位置,完全避免了重复元素的判断错误,也彻底解决了nil的问题。


内容的提问来源于stack exchange,提问作者poeticider

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 11:05:07