这只是一个简单的问题。我在这里编写一个功能,创建一个哈希,其中包含开发人员名称作为关键字,以及他为完成的每个功能总计得分的分数。但是我们确实有懒惰的开发人员没有将自己分配给任务,因此我们得到了以nil为键的哈希,我得到NoMethodError:未定义的方法`name'为零:NilClass。什么是一种无视零的清洁方式?这是我的代码
feat_hash = {}
features.group_by {|dev| dev.developer.name}.each {|dev_id, feat| feat_hash[dev_id] = feat.inject(0){|sum, x| sum + x.points}}
提前谢谢! :d
编辑:很酷,所以这是我运行时得到的输出。你会注意到它通过具有已分配功能的sprint和那些为空的sprint进行渲染,但只要它进入带有未分配功能的散列,其中nil作为键就会出错。
_________features___________
{"Gary"=>13, "Rob"=>8, "Hannes"=>8, "Sandra"=>1}
___________bugs_____________
{}
__________chores____________
{}
*************** New Sprint ************************
_________features___________
{}
___________bugs_____________
{}
__________chores____________
{}
*************** New Sprint ************************
_________features___________
{}
___________bugs_____________
{}
__________chores____________
{}
*************** New Sprint ************************
NoMethodError: undefined method `name' for nil:NilClass
然后是错误堆栈的其余部分
答案 0 :(得分:1)
您遇到此错误,因为在dev.developer.name
指令中,dev.developer
为nil
。您可以在group_by
features.reject {|dev| dev.developer.nil?}.group_by {|dev| dev.developer.name}.each { ...
答案 1 :(得分:0)
这是一种使用try
来避免此类错误的通用方法。
feat_hash = {}
features.group_by {|dev| dev.developer.name}.try(:each) do |dev_id, feat|
feat_hash[dev_id] = feat.inject(0){|sum, x| sum + x.points}
end