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

遍历多维数组计算总工作量时遇nil:NilClass的[]方法未定义错误

解决Ruby中遍历哈希时的undefined method []' for nil:NilClass`错误

嘿,我来帮你搞定这个报错问题!你遇到的错误主要有两个原因:符号键和字符串键不匹配,还有哈希的each循环用法不对,咱们一步步拆开来解决:

先搞清楚问题出在哪

1. 符号键 vs 字符串键不匹配

你定义的work_list里,所有的键都是符号类型(比如:data、:1、:2),但你代码里用work_list["data"]去取值——Ruby里符号和字符串是完全不同的对象,"data"不等于:data,所以这行代码会返回nil。之后你再用num["workload"],本质就是在nil上调用[]方法,自然就会抛出undefined method []' for nil:NilClass`错误了。

2. 哈希each循环的用法错误

就算键的问题解决了,你的嵌套each写法也有问题。当你list = work_list[:data]之后,list是一个包含:1、:2两个键的哈希,调用list.each do |num|时,num其实是[键, 值]的数组(比如[:1, {"team"=>"Design", ...}])。你再对num调用each,会把这个数组拆成单个元素,details先拿到:1这个符号,再拿到对应的哈希,这时候执行num["workload"]肯定会出错。

修正后的代码

这里给你两种写法,一种是更健壮的安全取值写法,另一种是简化版:

健壮版(推荐)

用Hash#dig方法可以安全地嵌套取值,中间任何一步不存在都会返回nil,不会直接报错:

work_list = { "data": { "1": { "team": "Design", "members": nil, "workload": { "process": { "total": 50, "finish": 36, "un_finish": 14, } } }, "2": { "team": "Account", "members": 15, "workload": { "process": { "total": 30, "finish": 20, "un_finish": 10, } } } } }

list = work_list[:data] # 用符号键:data匹配原始哈希的键类型
count = 0

list.each do |_team_num, team_details| # 明确接收哈希的键(_team_num)和值(team_details),下划线开头表示这个变量我们不需要用到
  # 用dig安全取值,避免中间某个字段缺失导致报错
  total_workload = team_details.dig(:workload, :process, :total)
  count += total_workload if total_workload # 只有取值不为nil时才累加
end

puts "The total workload is #{count}"

简化版(适合确定所有字段都存在的情况)

如果你能保证每个团队的workload.process.total都存在,可以简化成这样:

work_list = { "data": { "1": { "team": "Design", "members": nil, "workload": { "process": { "total": 50, "finish": 36, "un_finish": 14, } } }, "2": { "team": "Account", "members": 15, "workload": { "process": { "total": 30, "finish": 20, "un_finish": 10, } } } } }

list = work_list[:data]
count = 0

list.each do |_team_num, team_details|
  count += team_details[:workload][:process][:total]
end

puts "The total workload is #{count}"

额外注意事项

  • 区分Ruby的哈希和数组:数组用索引(比如arr[0])取值,哈希用键(符号、字符串等)取值;
  • 定义哈希时,key: value的写法生成的是符号键,"key" => value生成的是字符串键,两者不能混用;
  • 遍历哈希时,each方法默认返回的是[键, 值]的数组,记得正确接收这两个变量,避免循环逻辑混乱。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:54:30