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
相关产品推荐
相关产品推荐

