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

Ruby代码报错:Integer与nil比较失败(ArgumentError)求排查方案

问题分析与解决

错误原因

报错comparison of Integer with nil failed是因为代码中waste_min[idx]返回了nil,而total_waste是整数类型,整数与nil无法直接比较。

核心诱因:
waste_min数组是用flask_types作为长度初始化的,但markings.each_with_index遍历的是markings的元素。当markings的元素数量大于flask_types时,idx会超出waste_min的索引范围,此时访问waste_min[idx]就会得到nil。

修复代码

将waste_min的初始化逻辑改为基于markings的长度,确保每个markings元素都对应waste_min的一个有效位置:

def choose_flask(requirements, flask_types, markings)
    # 改为用markings的长度初始化,确保和遍历的索引匹配
    waste_min = Array.new(markings.size, Float::INFINITY)
    
    markings.each_with_index do |marks, idx|
        total_waste = 0
        valid = true
        
        requirements.each do |req|
            mark = marks.find { |m| m >= req }

            if mark.nil?
                valid = false
                break
            end
            
            waste = mark - req
            total_waste += waste
        end
        
        if valid && total_waste < waste_min[idx]
            waste_min[idx] = total_waste
        end
    end
    min_value = waste_min.min
    min_value == Float::INFINITY ? -1 : waste_min.index(min_value)
end

额外建议

如果方法设计中flask_types必须等于markings的长度,可以在方法开头添加参数校验,提前发现不合法输入:

def choose_flask(requirements, flask_types, markings)
    # 参数校验:确保烧瓶类型数量和刻度数组数量一致
    raise ArgumentError, "flask_types must match markings count" unless flask_types == markings.size
    
    waste_min = Array.new(markings.size, Float::INFINITY)
    
    # 后续逻辑不变...
end

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 03:02:43